C++ 死锁线程tcp服务器
两个线程A和B。A是一个网络线程,其中有来自客户端的来回信息。B是具有需要线程安全的变量的工作者 类A中有多个线程,而B只是一个线程。A的实例将添加到B的作业列表中,A将锁定,直到B完成任务。(线程安全作业列表工作正常) A将作业添加到B,然后锁定,但是在大多数情况下,在A锁定之前。B将处理作业,并在A应用锁之前(尝试)释放锁。导致了死锁C++ 死锁线程tcp服务器,c++,boost,C++,Boost,两个线程A和B。A是一个网络线程,其中有来自客户端的来回信息。B是具有需要线程安全的变量的工作者 类A中有多个线程,而B只是一个线程。A的实例将添加到B的作业列表中,A将锁定,直到B完成任务。(线程安全作业列表工作正常) A将作业添加到B,然后锁定,但是在大多数情况下,在A锁定之前。B将处理作业,并在A应用锁之前(尝试)释放锁。导致了死锁 我不确定我应该在这里做什么。我可以发布代码,但我认为在概念上更容易讨论 您似乎在使用应该使用条件的锁。引述: 类condition\u variable和co
我不确定我应该在这里做什么。我可以发布代码,但我认为在概念上更容易讨论 您似乎在使用应该使用条件的锁。引述: 类
condition\u variable
和condition\u variable\u any
提供了一种机制,使一个线程等待另一个线程通知特定条件已变为真
这听起来像是你想用锁做的 实际的问题在于B获得任务并在A的线程锁定之前开始执行它。您观察到的结果可归类为“错过通知”。通常在尝试使用互斥锁或其他简单同步器实现双向同步时 您必须确保B不会通知,除非A已经在等待,或者您可以确保不会错过通知 虽然第一种方法可能非常棘手,但后一种方法非常简单:使用信号量(或手动重置事件或(…) 关于信号量:
- 线程A希望将作业放入队列
- 线程A创建一个COUNT=0且MAX=1的信号量
- 线程A以某种方式将信号量添加到作业中
- 线程A将作业置于队列中
- 线程A等待信号量
- 线程A破坏信号量
- 线程B观察队列
- 线程B获得任务
- 线程B执行该任务
- 线程B解锁信号灯一次