一尘不染

如何实现无锁但阻塞的行为?

linux

我正在为密集型网络应用程序实现无锁的单一生产者单一使用者队列。我有一堆工作线程在各自独立的队列中接收工作,然后它们将出队并进行处理。

从这些队列中删除锁可以极大地提高高负载下的性能, 但是当队列为空时它们不再阻塞 ,从而导致CPU使用率猛增。

我如何有效地使线程阻塞,直到它可以成功出队或被杀死/中断?


阅读 282

收藏
2020-06-07

共1个答案

一尘不染

如果您使用的是Linux,请考虑使用Futex。它通过使用原子操作而不是像互斥锁那样的内核调用来提供非锁定实现的性能,但是如果由于某些条件不正确(例如,锁争用)而需要将进程设置为空闲时,它将实现然后进行适当的内核调用以使进程进入睡眠状态,并在以后的事件中将其唤醒。基本上就像一个非常快的信号灯。

2020-06-07