From 5a68a16d6cb966806e0da15f22c9b3293a610d0b Mon Sep 17 00:00:00 2001 From: 5dyrcj <3193154849@qq.com> Date: Wed, 1 Jul 2026 15:52:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9:=E5=89=A9=E4=BD=99=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=89=A7=E8=A1=8C=E5=AE=8C=EF=BC=8C=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0=E6=89=8D=E4=BC=9A=E9=80=80=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- muduo/base/ThreadPool.cc | 11 +++++++++-- muduo/base/ThreadPool.h | 1 + muduo/base/tests/ThreadPool_test.cc | 23 +++++++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/muduo/base/ThreadPool.cc b/muduo/base/ThreadPool.cc index 6905dd7d5..e284f5916 100644 --- a/muduo/base/ThreadPool.cc +++ b/muduo/base/ThreadPool.cc @@ -18,7 +18,8 @@ ThreadPool::ThreadPool(const string& nameArg) notFull_(mutex_), name_(nameArg), maxQueueSize_(0), - running_(false) + running_(false), + havetask_(false) { } @@ -86,6 +87,7 @@ void ThreadPool::run(Task task) assert(!isFull()); queue_.push_back(std::move(task)); + havetask_=true; notEmpty_.notify(); } } @@ -108,6 +110,10 @@ ThreadPool::Task ThreadPool::take() notFull_.notify(); } } + else + { + havetask_=false; + } return task; } @@ -125,7 +131,7 @@ void ThreadPool::runInThread() { threadInitCallback_(); } - while (running_) + while (running_||havetask_) { Task task(take()); if (task) @@ -154,3 +160,4 @@ void ThreadPool::runInThread() } } + diff --git a/muduo/base/ThreadPool.h b/muduo/base/ThreadPool.h index 385c1bbcc..aa2a7e85d 100644 --- a/muduo/base/ThreadPool.h +++ b/muduo/base/ThreadPool.h @@ -60,6 +60,7 @@ class ThreadPool : noncopyable std::deque queue_ GUARDED_BY(mutex_); size_t maxQueueSize_; bool running_; + bool havetask_; }; } // namespace muduo diff --git a/muduo/base/tests/ThreadPool_test.cc b/muduo/base/tests/ThreadPool_test.cc index de0dd6093..36ed82724 100644 --- a/muduo/base/tests/ThreadPool_test.cc +++ b/muduo/base/tests/ThreadPool_test.cc @@ -1,3 +1,4 @@ +#include #include "muduo/base/ThreadPool.h" #include "muduo/base/CountDownLatch.h" #include "muduo/base/CurrentThread.h" @@ -17,6 +18,12 @@ void printString(const std::string& str) usleep(100*1000); } +void selfprint() +{ + std::cout<<"这是一次调用"<<"\n"; + usleep(5000*1000); +} + void test(int maxSize) { LOG_WARN << "Test ThreadPool with max queue size = " << maxSize; @@ -86,6 +93,20 @@ void test2() LOG_WARN << "test2 Done"; } +void test3() +{ + muduo::ThreadPool pool("miniThread"); + pool.setMaxQueueSize(10); + pool.start(3); + for(int i=0;i<8;++i) + { + pool.run(selfprint); + } + usleep(100000); + pool.stop(); + std::cout<<"线程池运行退出了"<