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

发布于 2024-12-05 04:31:16 字数 527 浏览 1 评论 0原文

设想: - 我的主(UI)线程(线程“M”)运行,并启动工作线程(“W”)来控制某些硬件。 - “W”想要经常向“M”发送进度通知。 - 通知调用不能阻塞“W”...“W”需要调用并立即返回; “M”将异步处理通知,并且不会向“W”返回任何内容。 - “M”必须通过线程“M”上运行的回调来通知。 - 必须能够传递数据(不用担心数据的线程安全性)。

.NET 在其 System.ComponentModel.AsyncOperation 类中就有这样的工具,但我想要创建跨平台代码,而不仅仅是 .NET 甚至严格的 Win32(尽管我的第一个平台是 Win32 上的本机 c++)。

使用 Boost 将是一个优势。

我读过这个: Boost:触发并忘记异步函数调用? 但我想知道是否有比启动额外的辅助线程更简单的需求。

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

Scenario:
- My main (UI) thread (Thread "M") runs, and spins up a worker thread ("W") to control with some hardware.
- "W" wants to send progress notifications to "M" every so often.
- The notification-invocation can't block "W"... "W" needs to make the call and return immediately; "M" will process the notification async and not return anything to "W".
- "M" must notified by a callback running on thread "M".
- Must be able to pass data (don't worry about thread-safeness of data).

.NET has just such a facility in it's System.ComponentModel.AsyncOperation class, but I'm wanting to create cross-platform code, not just .NET or even strictly Win32 (though my 1st platform is native c++ on Win32).

Using Boost would be a plus.

I've read this:
Boost: Fire and forget asynchronous function call?
but am wondering if there's a simpler want than to spin up additional helper threads.

Any ideas and/or links would be greatly appreciated!
-Dave

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

鸢与 2024-12-12 04:31:16

如果您使用 Boost.Thread 那么您可以使用条件变量

If you are using Boost.Thread then you can use a condition variable.

久而酒知 2024-12-12 04:31:16

我将这样做:

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

编辑:请注意,使用互斥锁的要求是可选的。这将是最常见、最跨平台友好的解决方案,这就是我将其放在示例中的原因。如果“W”线程永不阻塞的要求是最强的要求,那么您可以用无锁数据结构替换列表+互斥锁,假设您的平台有一个无锁数据结构。

Here is how I would do it:

  • You have to setup a message list, which could be implemented, for example, as a linked list. Access to this list must always be protected by a mutex.
  • When "W" wants to send an update to "M" it just adds the new data at the end of the message list.
  • After appending to the message list, "W" can signal to "M" that there is new data using, for example, a semaphore.
  • "M" can do whatever tasks it needs to do, and every so often can check the state of the semaphore. If the semaphore is in signaled state it can reset it and consume the messages from the list.

Edit: note that the requirement to use a mutex is optional. This would be the most common, most cross-platform friendly solution and that is why I put it in my example. If the requirement for the "W" thread to never block is the strongest requirement, then you can replace the list+mutex with a lock-free data structure, assuming you have one for your platform.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文