File tree Expand file tree Collapse file tree 2 files changed +24
-4
lines changed Expand file tree Collapse file tree 2 files changed +24
-4
lines changed Original file line number Diff line number Diff line change @@ -549,8 +549,11 @@ class ThreadPool : public TaskQueue {
549
549
~ThreadPool () override = default ;
550
550
551
551
void enqueue (std::function<void ()> fn) override {
552
- std::unique_lock<std::mutex> lock (mutex_);
553
- jobs_.push_back (std::move (fn));
552
+ {
553
+ std::unique_lock<std::mutex> lock (mutex_);
554
+ jobs_.push_back (std::move (fn));
555
+ }
556
+
554
557
cond_.notify_one ();
555
558
}
556
559
@@ -559,9 +562,10 @@ class ThreadPool : public TaskQueue {
559
562
{
560
563
std::unique_lock<std::mutex> lock (mutex_);
561
564
shutdown_ = true ;
562
- cond_.notify_all ();
563
565
}
564
566
567
+ cond_.notify_all ();
568
+
565
569
// Join...
566
570
for (auto &t : threads_) {
567
571
t.join ();
@@ -583,7 +587,7 @@ class ThreadPool : public TaskQueue {
583
587
584
588
if (pool_.shutdown_ && pool_.jobs_ .empty ()) { break ; }
585
589
586
- fn = pool_.jobs_ .front ();
590
+ fn = std::move ( pool_.jobs_ .front () );
587
591
pool_.jobs_ .pop_front ();
588
592
}
589
593
Original file line number Diff line number Diff line change 5
5
#include < atomic>
6
6
#include < chrono>
7
7
#include < future>
8
+ #include < memory>
8
9
#include < sstream>
9
10
#include < stdexcept>
10
11
#include < thread>
@@ -5522,3 +5523,18 @@ TEST(SocketStream, is_writable_INET) {
5522
5523
ASSERT_EQ (0 , close (disconnected_svr_sock));
5523
5524
}
5524
5525
#endif // #ifndef _WIN32
5526
+
5527
+ TEST (TaskQueueTest, IncreaseAtomicInteger) {
5528
+ static constexpr unsigned int number_of_task{1000000 };
5529
+ std::atomic_uint count{0 };
5530
+ std::unique_ptr<TaskQueue> task_queue{
5531
+ new ThreadPool{CPPHTTPLIB_THREAD_POOL_COUNT}};
5532
+
5533
+ for (unsigned int i = 0 ; i < number_of_task; ++i) {
5534
+ task_queue->enqueue (
5535
+ [&count] { count.fetch_add (1 , std::memory_order_relaxed); });
5536
+ }
5537
+
5538
+ EXPECT_NO_THROW (task_queue->shutdown ());
5539
+ EXPECT_EQ (number_of_task, count.load ());
5540
+ }
You can’t perform that action at this time.
0 commit comments