gpt4 book ai didi

c - 在事件中 sleep

转载 作者:可可西里 更新时间:2023-11-01 11:59:26 25 4
gpt4 key购买 nike

我有一个多线程程序,其中我无条件地在一个线程(线程 A)中休眠无限时间。当另一个线程(Thread B)中发生事件时,它通过发信号唤醒 Thread-A。现在我知道有多种方法可以做到这一点。当我的程序在windows环境下运行时,我在Thread-A中使用WaitForSingleObject,在Thread-B中使用SetEvent。它工作正常。我还可以使用基于文件描述符的模型进行轮询、选择。有不止一种方法可以做到这一点。但是,我试图找到最有效的方法。我想在 Thread-B 发出信号时尽快唤醒 Thread-A。你认为什么是最好的选择。我可以探索基于驱动程序的选项。

谢谢

最佳答案

如前所述,在线程 B 中触发 SetEvent 并在线程 A 中触发 WaitForSingleObject 速度很快。但是,必须考虑一些条件:

  • 单核/处理器:正如 Martin 所说,等待线程将抢占信号线程。使用这样的方案,您应该注意信号线程 (B) 在 SetEvent 之后立即进入空闲状态。例如,这可以通过 sleep(0) 来完成。

  • 多核/处理器:有人可能认为将两个线程放在不同的内核/处理器上会有优势,但这并不是一个好主意。如果两个线程都在同一个核心/处理器上,则调用 SetEventWaitForSingleObject 返回之间的时间跨度要短得多。

  • 在一个核心上处理两个线程 (SetThreadAffinityMask) 还允许通过优先级设置 (SetThreadPriority) 来处理它们的行为。您可以以更高的优先级运行等待线程,或者您必须确保信号线程在设置事件后确实没有做任何事情。

  • 您必须处理其他一些同步问题:下一个事件何时发生?线程A会完成它的任务吗?最有效的是可以使用第二个事件来解决这个问题:当线程 A 完成后,它设置一个事件以指示允许线程 B 再次设置它的事件。线程B会有效的先设置事件,然后等待反馈事件,满足立即空闲的要求。

  • 如果您希望允许线程 B 在线程 A 未完成且尚未处于等待状态时设置事件,则应考虑使用信号量而不是事件。这样,来自线程 B 的“调用/事件”的数量将被保留,并且线程 A 中的等待函数可以跟进,因为它返回信号量已被释放的次数。信号量对象与事件一样快。

总结:

  • 通过 SetThreadAffinityMask 让两个线程在同一个核心/cpu 上。

  • 通过另一个事件扩展 SetEvent/WaitForSingleObject 以建立握手

  • 根据处理的细节,您还可以考虑 semaphore objects .

关于c - 在事件中 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11748979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com