在C ++中执行跨平台线程间通知的好方法是什么?

时间:2011-09-14 21:25:14

标签: c++ multithreading cross-platform

方案: - 我的主(UI)线程(线程“M”)运行,并旋转工作线程(“W”)以控制某些硬件。 - “W”希望每隔一段时间向“M”发送进度通知。 - 通知调用不能阻止“W”......“W”需要进行呼叫并立即返回; “M”将处理通知异步,不返回任何“W”。 - “M”必须通过在线程“M”上运行的回调通知。 - 必须能够传递数据(不要担心数据的线程安全性)。

.NET在它的System.ComponentModel.AsyncOperation类中有这样的功能,但我想创建跨平台代码,而不仅仅是.NET,甚至是严格的Win32(尽管我的第一个平台是Win32上的原生c ++)

使用Boost是一个优势。

我读过这个: Boost: Fire and forget asynchronous function call? 但我想知道是否有一个更简单的想要而不是启动额外的帮助线程。

任何想法和/或链接将不胜感激! -Dave

2 个答案:

答案 0 :(得分:1)

如果您使用Boost.Thread,则可以使用condition variable

答案 1 :(得分:0)

我将如何做到这一点:

  • 您必须设置一个消息列表,例如,可以将其作为链接列表实现。访问此列表必须始终受互斥锁保护。
  • 当“W”想要向“M”发送更新时,它只是在消息列表的末尾添加新数据。
  • 在附加到消息列表后,“W”可以向“M”发出信号,表示有新数据使用,例如,信号量。
  • “M”可以执行它需要执行的任何任务,并且每隔一段时间就可以检查信号量的状态。如果信号量处于信号状态,它可以重置它并使用列表中的消息。

编辑:请注意,使用互斥锁的要求是可选的。这将是最常见,最平台友好的解决方案,这就是为什么我把它放在我的例子中。如果永远阻止“W”线程的要求是最强的要求,那么你可以用无锁数据结构替换list + mutex,假设你的平台有一个。