我正在使用带有boost线程的c ++,锁定互斥锁以及所有好东西。
两个线程A和B.A是一个网络线程,其中有来自客户端的信息来回传递。 B是一个需要线程安全的变量的工作者。
A类中有多个线程,B只是一个线程。 A的实例将添加到B的作业列表中,A将锁定,直到B完成任务。 (线程安全的工作列表工作正常)
A将作业添加到B然后锁定,但在大多数情况下,在A锁定之前。 B将处理该作业并在A应用它之前(尝试)释放锁定。导致死锁。
我不确定我应该在这做什么。我可以发布代码,但我想在概念上更容易讨论。
答案 0 :(得分:1)
您似乎在使用应该使用条件的锁。引用boost docs:
类
condition_variable
和condition_variable_any
为一个线程提供了一种机制,可以等待来自另一个线程的特定条件变为真的通知。
这听起来就像你想用锁做的那样。
答案 1 :(得分:1)
实际问题在于B获取任务并在A的线程锁定之前开始执行它。观察者的结果可归类为“遗漏通知”。通常在尝试与互斥锁或其他简单同步器实现双向同步时。
除非A已在等待,否则您必须确保B不会通知,或者您可以确保不会错过通知。
虽然第一种方式可能非常棘手,但后者非常简单:使用信号量(或手动重置事件或(...))。
信号量:
,同时:
请注意,如果计数,则信号量UNLOCK是非阻塞的
您可以使用手动设置/重置的事件,而不是使用信号量。只需让A创建并锁定关闭的事件,然后让B将其设置为开启。