Mutex vs忙等待tcp io

时间:2012-06-11 23:22:41

标签: c linux multithreading tcp mutex

我不关心是一个cpu猪,因为我有一个线程分配给每个核心,系统线程被阻塞到他们自己的集合。我的理解是,当其他任务要运行时,互斥是有用的,在这种情况下这并不重要所以我正在考虑在内存中的地址上等待消费者线程循环等待它的值为非零 - 就像在单个生产者中一样使用TCP_NONBLOCK循环recv()的线程设置刚存放的信息,现在它不为零。

根据我的情况,我的植入是聪明的还是我应该使用互斥或​​自定义中断,即使没有其他任务会运行。

2 个答案:

答案 0 :(得分:2)

繁忙等待可以在某些情况下为您提供更低的延迟和更好的性能。

让其他线程使用CPU是不明智的理由,但还有其他线程:

  1. 消耗更多电量。空闲CPU进入低功耗状态,非常显着地降低了功耗。功耗是数据中心的一个主要问题,任何严肃的应用都必须浪费能源。

  2. 如果您的代码在虚拟机中运行(现在所有内容都已虚拟化),您的计算机将与其他人竞争CPU。消耗100%的CPU会减少其他CPU,并且可能会导致虚拟机管理程序在真正需要时为您的机器提供更少的CPU。

  3. 你应该始终坚持主流方法,除非有充分理由不这样做。在这种情况下,主流是使用selectpoll(或epoll)。如果你愿意,这可以让你在等待时做其他事情,并且不会浪费CPU时间。性能差异是否足以证明忙碌等待的合理性?

答案 1 :(得分:2)

除了@ugoren的观点和其他人的评论:

即使你有一个有效的用例来忙碌等待和刻录核心,这是很少见的,你需要:

  • 保护线程之间共享的数据。这是锁定发挥作用的地方 - 访问任何复杂的共享数据结构时需要mutual exclusion。人们倾向于在这里研究lock-free算法,但这些方法并不明显且容易出错,仍被视为深黑魔法。在你对并发性有充分的了解之前,不要尝试这些。
  • 通知线程有关已更改的状态。这是您使用conditional variables或监视器的地方。还有其他方法,例如Linux上的eventfd(2)

以下是一些链接,您可以证明它比您想象的要困难得多: