我不关心成为一个 CPU 猪,因为我为每个内核分配了一个线程,并且系统线程被阻止到它们自己的集合中。我的理解是,当其他任务要运行时,互斥锁很有用,在这种情况下,这并不重要,所以我正在考虑在内存中的地址上使用消费者线程循环,等待其值不为零 - 就像在单个生产者中一样使用 TCP_NONBLOCK 循环 recv() 的线程只设置了存储信息,现在它不为零。
考虑到我的情况,我的植入是聪明的,还是应该使用互斥锁或自定义中断,即使没有其他任务将运行。
我不关心成为一个 CPU 猪,因为我为每个内核分配了一个线程,并且系统线程被阻止到它们自己的集合中。我的理解是,当其他任务要运行时,互斥锁很有用,在这种情况下,这并不重要,所以我正在考虑在内存中的地址上使用消费者线程循环,等待其值不为零 - 就像在单个生产者中一样使用 TCP_NONBLOCK 循环 recv() 的线程只设置了存储信息,现在它不为零。
考虑到我的情况,我的植入是聪明的,还是应该使用互斥锁或自定义中断,即使没有其他任务将运行。
在某些情况下,忙碌等待可以为您提供更低的延迟和更好的性能。
让其他线程使用 CPU 是不这样做的明显原因,但还有其他原因:
你消耗更多的能量。空闲 CPU 进入低功耗状态,显着降低功耗。功耗是数据中心的一个主要问题,任何严肃的应用程序都必须有点浪费电力。
如果您的代码在虚拟机中运行(并且现在一切都在虚拟化),那么您的机器会与其他机器竞争 CPU。消耗 100% 的 CPU 会为其他人留下更少的资源,并且可能会导致虚拟机管理程序在真正需要时为您的机器提供更少的 CPU。
你应该始终坚持主流方法,除非有充分的理由不这样做。在这种情况下,主流是使用select
或poll
(或epoll
)。如果您愿意,这可以让您在等待时做其他事情,并且不会浪费 CPU 时间。性能差异是否足以证明忙碌等待的合理性?
除了@ugoren 的观点和其他人的评论:
即使您有一个有效的忙于等待和刻录内核的用例,这无疑是罕见的,您也需要:
mutual exclusion
访问任何复杂的共享数据结构时都需要。人们倾向于在lock-free
这里研究算法,但这些方法并不明显且容易出错,仍然被认为是深奥的黑魔法。在你对并发有充分的理解之前,不要尝试这些。conditional variables
或监控的地方。还有其他方法,eventfd(2)
例如在 Linux 上。以下是一些链接,您可以证明它比您想象的要困难得多: