68,372
社区成员




class Threadpool {
std::atomic_bool isPoolRunning_;
std::mutex taskQueMtx_;
std::condition_variable notEmpty_;
...
}
析构函数
Threadpool::~Threadpool() {
isPoolRunning_ = false;
notEmpty_.notify_all();
①std::unique_lock<std::mutex> lock(taskQueMtx_);
②exitCond_.wait(lock, [&]()-> bool { return threads_.size() == 0; });
}
线程函数
void Threadpool::threadFunc(int threadid)
{
auto lastTime = std::chrono::high_resolution_clock().now();
while(isPoolRunning_) {
③std::shared_ptr<Task> task;
//获取到任务,顺利释放锁
{
//要操作线程队列,先获取锁
④std::unique_lock<std::mutex> lock(taskQueMtx_);
std::cout << "tid=" << std::this_thread::get_id() << " 尝试获取任务" << std::endl;
......
}
有一套多线程的代码
我感觉退出的时候有互锁的可能性
主线程:到析构了①首先抢夺了锁
然后②陷入等待,但是锁没有释放
这时候如果子线程正好跑到③的位置
那是不是到④就互锁了?
百思不得其解,哪个高手帮着解释一下
关键是这玩意跑的很好,从来就没出过问题
给本帖投票
在析构函数中,线程pool在等待所有子线程退出时一直持有taskQueMtx_的锁,这会导致在子线程尝试获取任务时无法获取到锁,从而导致互锁的情况。为了避免这种情况,可以使用线程安全的等待所有子线程退出的方式,例如使用std:🧵:join_all()函数等待所有子线程退出。这样可以避免在等待过程中一直持有锁的情况,从而避免互锁问题。
常在c用多线程处理数据,没在c++用过,但原理应该差不多。看你的程序只有一个锁,在一个线程上锁后其他线程无法使用这个锁,所以应该不会有冲突。