唤醒线程池线程的最快方法

Car*_*ood 5 c linux futex

我编写了一个线程池,其中包含尽可能多的线程(备用核心),以避免上下文切换。每当需要执行新任务时,该任务就会添加到无锁环形缓冲区中,供线程池中的线程使用。每次添加新任务时,我当前都会调用sem_post

我的基准测试显示,sem_post当有线程等待信号量时,调用需要 10 微秒。有些调用只需要 50 纳秒(这可能意味着完全在用户空间中可以确定没有可以唤醒的线程),但 350 +/- 30 纳秒也是一个常见的值。

这个问题是关于一个或多个线程无事可做并且正在等待信号量的情况。

我一点也不高兴,在这种情况下,调用者(试图唤醒一个新线程)在sem_post.

是否有一种更快的方法(从调用者的角度来看)来唤醒休眠线程?我可以忍受 10 微秒的延迟,直到新线程最终开始运行,但唤醒线程不应延迟那么多。

我可以找到的相关问题(但不回答我的问题)是

请注意,信号量似乎是在 futex 之上实现的。我认为 futex 是 Linux 上最快的方法?也许使用信号或中断更快?