多线程程序挂起条件等待

Multi threaded program hangs on condition wait

本文关键字:等待 条件 挂起 程序 多线程      更新时间:2023-10-16

我有以下一段代码。我正在使用 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()什么也没给你,只是语法噪音)