多线程程序挂起条件等待
Multi threaded program hangs on condition wait
我有以下一段代码。我正在使用 c++11 线程来编写一个简单的多线程生产者消费者问题。
class W
{
public:
explicit W();
void p();
void c();
private:
std::deque<std::uint64_t> q;
std::shared_ptr<std::mutex> m;
std::shared_ptr<std::condition_variable> cvQEmpty;
std::shared_ptr<std::condition_variable> cvQFull;
const std::size_t queue_size;
};
W::W()
: m(std::make_shared<std::mutex>()),
cvQEmpty(std::make_shared<std::condition_variable>()),
cvQFull(std::make_shared<std::condition_variable>()),
queue_size(3)
{
}
void
W::p()
{
while(1)
{
std::unique_lock<std::mutex> lk(*m.get());
if (q.size() >= queue_size)
{
cvQFull->wait(lk, [this] { return q.size() < queue_size; });
}
q.push_back(q.size());
std::cout << "Pushed " << q[q.size() - 1] << std::endl;
lk.unlock();
cvQEmpty->notify_one();
}
}
void
W::c()
{
while (1)
{
std::unique_lock<std::mutex> lk(*m.get());
if (q.empty())
{
cvQEmpty->wait(lk, [this] { return !q.empty(); });
}
while(!q.empty())
{
const std::uint64_t val = q[0];
std::cout << "Output : " << val << std::endl;
q.pop_back();
}
lk.unlock();
cvQFull->notify_one();
}
}
void
foo()
{
W w;
std::thread p(&W::p, w);
std::thread c(&W::c, w);
c.join();
p.join();
}
两个线程在条件等待时都死锁。
你能告诉我我哪里出错了吗?该程序编译良好,没有任何警告。
使用的编译器是: g++-5.8
很简单。您正在将 w
参数复制到两个线程,并调用复制构造函数。这些线程最终使用两个独立的队列!
解决 方案:
- 使您的队列像互斥锁一样
shared_ptr
- (更好)将您的论点包含在
std::ref
中。
(附带说明一下,explicit W()
什么也没给你,只是语法噪音)
相关文章:
- 子线程中的条件变量等待停止主线程中的执行
- 正在连接的等待条件变量的线程会发生什么情况?
- 如何"stop"正在等待条件变量的分离线程?
- 如何修复条件变量等待/通知的竞争条件
- 可以在同一条件变量上等待多个线程
- 等待条件变量后未并行运行的线程
- 如何停止C 程序在等待条件时关闭时崩溃
- 等待条件变量是否会加载 CPU 内核
- 使用std::conditional_variable等待条件
- 你真的能用WaitFor..等待条件变量吗..对象
- C++如何等待条件满足
- 在发出等待条件变量的信号后,线程何时获取锁?是什么决定了它
- 为什么在使用qt等待条件时不必包装lock/unlock语句
- 等待条件的空循环(忙等待)
- Q等待条件,手动复位除外?(或者在Qt Concurrent之外创建QFuture对象?)
- 在1个线程上运行的boost::asio::io_service如何唤醒等待条件
- Boost:等待工作线程等待条件变量
- 如何在信号槽中设置等待条件
- 等待条件下的C++线程死锁
- 等待条件的非线程替代方案.(编辑:Proactor模式与boost.asio?)