我编写了一个线程池,该线程池具有尽可能多的线程(备用内核),以避免上下文切换。每当需要执行新任务时,都会将该任务添加到无锁环形缓冲区中,以消耗线程池中的线程。每次添加新任务时,我当前都会调用sem_post。
我的基准测试表明,当有线程在等待信号量时,对sem_post
的调用需要10微秒。有些调用仅花费50 ns(这可能意味着完全在用户空间中可以确定没有线程可以被唤醒),但是350 +/- 30纳秒是一个经常看到的值。
这个问题是关于一个或多个线程无所事事并且正在等待信号量的情况。
在这种情况下,调用方(试图唤醒新线程)在sem_post
中花费了10微秒的时间,我一点都不高兴。
从调用者的角度来看,是否存在更快的方法来唤醒睡眠线程?我可以忍受10微秒的延迟,直到该新线程最终开始运行,但是唤醒该线程的线程不应延迟太多。
我可以找到(但不回答我的问题)的相关问题
请注意,信号量似乎是在futex之上实现的。 我认为futex是Linux上最快的方法吗?也许使用信号或中断会更快?