我不在乎成为一个 cpu pig ,因为我为每个核心分配了一个线程,系统线程被阻塞到他们自己的集合。我的理解是当其他任务要运行时互斥锁是有用的,在这种情况下这并不重要所以我正在考虑在内存中的地址上使用消费者线程循环等待其值不为零 - 就像在单个生产者中一样使用 TCP_NONBLOCK 设置循环 recv() 的线程刚刚存储了信息,现在它是非零的。
考虑到我的情况,我的植入是否明智,或者我是否应该使用互斥锁或自定义中断,即使没有其他任务将运行。
最佳答案
除了@ugoren 的观点和其他人的评论:
即使您有忙等待和燃烧核心的有效用例(公认的罕见),您也需要:
- 保护线程间共享的数据。这是锁发挥作用的地方 - 你需要
mutual exclusion
在访问任何复杂的共享数据结构时。人们倾向于调查lock-free
这里的算法,但这些方式并不明显且容易出错,仍然被认为是深黑魔法。在您对并发性没有充分的了解之前,甚至不要尝试这些。 - 通知线程有关更改的状态。这是您要使用
conditional variables
的地方或显示器。还有其他方法,eventfd(2)
例如,在 Linux 上。
这里有一些链接可以让你证明这比你想象的要难得多:
关于c - 互斥锁 vs 忙等待 tcp io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10988710/