关于C++的多线程同步的条件变量如何运作?

condition_variable cv;
mutex mu;
void thread1()
{
    mu.lock();
    unique_lock<mutex>lck(mu);
    cv.wait(lck);
    cout<<1;

}
void thread2()
{
    sleep(1);
    mu.lock();
    cv.notify_all();
    cout<<2;
    
}
int main()
{
    thread t1(thread1);
    thread t2(thread2);
    sleep(2);

}

我理解中的条件变量完成3件事.
1.解锁互斥锁.
2.等待通知.
3.通知到来后,再次给互斥锁上锁.
但这个不对劲,线程1开始wait之后,互斥锁应该已经解开了,线程2为什么依然没法获取互斥锁?
最后两个程序都应该打印一个数字,但实际上它们什么也不打印.

阅读 3.2k
2 个回答

企业微信截图_1692165542888.png
解决办法移除线程2的 mu.lock()

void thread2()
{
    sleep(1);
    cv.notify_all();
    cout << 2;
}
mutex mu;
condition_variable cv;

void thread1()
{
    unique_lock<mutex> lck(mu); 
    cv.wait(lck);
    cout << 1;
}

void thread2()
{
    sleep(1);
    unique_lock<mutex> lck(mu); 
    cv.notify_all(); 
    cout << 2;
}

int main()
{
    thread t1(thread1);
    thread t2(thread2);
    t1.join(); 
    t2.join(); 
}
    mu.lock();
    unique_lock<mutex>lck(mu);

unique_lock 的构造会调用 mu.lock(),于是直接死锁了,因为 mu 已经被加锁了。走不到 wait 。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题