当前位置: 首页 > 知识库问答 >
问题:

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

强阳曜
2023-08-16
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为什么依然没法获取互斥锁?
最后两个程序都应该打印一个数字,但实际上它们什么也不打印.

共有2个答案

詹钊
2023-08-16
    mu.lock();    unique_lock<mutex>lck(mu);

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

盖雪峰
2023-08-16

企业微信截图_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(); }
 类似资料:
  • 我正在研究哲学家进餐问题,n位哲学家轮流思考和进餐。我想有一个版本,哲学家们会按照id的顺序进食:0,1,2,3,4。。。,但是我的线程一直被阻塞。我的线程从调用PhilosopherThread开始。 我想把哲学家们整理好有点麻烦。我只能在线程堵塞之前吃前2个线程。 编辑:据我所知,我这样做是对的。我首先锁定互斥锁,然后检查pindex是否是当前线程id,如果不是,线程将等待,直到pindex等

  • 本文向大家介绍详解C#多线程之线程同步,包括了详解C#多线程之线程同步的使用技巧和注意事项,需要的朋友参考一下 多线程内容大致分两部分,其一是异步操作,可通过专用,线程池,Task,Parallel,PLINQ等,而这里又涉及工作线程与IO线程;其二是线程同步问题,鄙人现在学习与探究的是线程同步问题。 通过学习《CLR via C#》里面的内容,对线程同步形成了脉络较清晰的体系结构,在多线程中实现

  • 本文向大家介绍C# 线程同步的方法,包括了C# 线程同步的方法的使用技巧和注意事项,需要的朋友参考一下 一、进程内部的线程同步 1、使用lock,用法如下: 特性:只能传递对象,无法设置等待超时 2、使用:InterLocked(原子操作) 其在System.Threading命名空间下,Interlocked实际是类控制计数器,从而实现进程的同步,其很容易实现生产者消费者模型 3、使用Monit

  • 本文向大家介绍C# 中如何实现线程同步?相关面试题,主要包含被问及C# 中如何实现线程同步?时的应答技巧和注意事项,需要的朋友参考一下 (1)方法一:阻塞(调用Sleep()或Join()) (2)方法二:加互斥锁lock (3)方法三:信号和句柄(AutoResetEvent/ManualResetEvent,调用Set()和WaitOne())    

  • 我在一个用C语言编写的多线程服务器应用程序上工作,并在嵌入式Linux上执行。一个线程(我称之为通信线程)应该处理所有套接字I/O(发送和接收消息)。依赖于接收到的消息,通信线程将消息发送到另一个线程(例如Thread)。Controller-Thread)处理所需的序列。控制器线程在序列的末尾创建返回消息。此消息被写回通信线程,该线程应该将它们传输到客户端。 这两个线程之间的通信是通过队列实现的

  • 本文向大家介绍详解c# 线程同步,包括了详解c# 线程同步的使用技巧和注意事项,需要的朋友参考一下 一、线程同步概述 前面的文章都是讲创建多线程来实现让我们能够更好的响应应用程序,然而当我们创建了多个线程时,就存在多个线程同时访问一个共享的资源的情况,在这种情况下,就需要我们用到线程同步,线程同步可以防止数据(共享资源)的损坏。 然而我们在设计应用程序还是要尽量避免使用线程同步, 因为线程同步会产