死锁线程tcp服务器

时间:2012-09-01 13:07:53

标签: c++ boost

我正在使用带有boost线程的c ++,锁定互斥锁以及所有好东西。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

您似乎在使用应该使用条件的锁。引用boost docs

  

condition_variablecondition_variable_any为一个线程提供了一种机制,可以等待来自另一个线程的特定条件变为真的通知。

这听起来就像你想用锁做的那样。

答案 1 :(得分:1)

实际问题在于B获取任务并在A的线程锁定之前开始执行它。观察者的结果可归类为“遗漏通知”。通常在尝试与互斥锁或其他简单同步器实现双向同步时。

除非A已在等待,否则您必须确保B不会通知,或者您可以确保不会错过通知。

虽然第一种方式可能非常棘手,但后者非常简单:使用信号量(或手动重置事件或(...))。

信号量:

  • 线程A想要将作业放入队列
  • 线程A创建一个信号量,其COUNT = ZERO且MAX = 1
  • 线程A以某种方式将信号量添加到作业
  • 线程A将作业放入队列
  • 线程A等待信号量
  • 线程A破坏信号量

,同时:

  • 线程B观察队列
  • 主题B获得任务
  • 主题B执行作业
  • 线程B解锁信号量ONCE

请注意,如果计数,则信号量UNLOCK是非阻塞的

您可以使用手动设置/重置的事件,而不是使用信号量。只需让A创建并锁定关闭的事件,然后让B将其设置为开启。