Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 死锁线程tcp服务器_C++_Boost - Fatal编程技术网

C++ 死锁线程tcp服务器

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

两个线程A和B。A是一个网络线程,其中有来自客户端的来回信息。B是具有需要线程安全的变量的工作者

类A中有多个线程,而B只是一个线程。A的实例将添加到B的作业列表中,A将锁定,直到B完成任务。(线程安全作业列表工作正常)

A将作业添加到B,然后锁定,但是在大多数情况下,在A锁定之前。B将处理作业,并在A应用锁之前(尝试)释放锁。导致了死锁


我不确定我应该在这里做什么。我可以发布代码,但我认为在概念上更容易讨论

您似乎在使用应该使用条件的锁。引述:

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解锁信号灯一次
请注意,如果计数为,则信号量解锁是非阻塞的 除了使用信号量,您还可以将事件与手动设置/重置一起使用。只需让A创建并锁定关闭的事件,然后让B将其设置为打开