在不使用条件变量的情况下唤醒线程的最快方法

时间:2011-04-08 09:19:01

标签: c++ c multithreading performance atomic

我正在尝试通过设置后台线程来解决一个特定任务来加速一段代码。当我需要解决我的任务时,我想唤醒这些线程,完成工作并再次阻止它们等待下一个任务。任务总是一样的。

我尝试使用条件变量(以及需要与它们一起使用的互斥锁),但最终我减慢了代码速度,而不是加快速度;主要是因为调用所有需要的函数非常昂贵(pthread_cond_wait/pthread_cond_signal/pthread_mutex_lock/pthread_mutex_unlock)。

使用线程池(我没有)是没有意义的,因为它是一个过于通用的构造;在这里,我只想解决我的具体任务。根据实现情况,我还会为队列支付性能损失。

对于在不使用mutexcon_var的情况下快速唤醒,您有什么建议吗?

我正在考虑设置线程,比如定时器读取atomic variable;如果变量设置为1,则线程将完成工作;如果它被设置为0,它们将进入睡眠状态几微秒(我将从微秒睡眠开始,因为我想避免使用可能对CPU来说太贵的spinlocks)。你怎么看待这件事?任何建议都非常感谢。

我使用的是Linux,gcc,C和C ++。

2 个答案:

答案 0 :(得分:4)

这些功能应该很快。如果他们占用了你很大一部分时间,你很可能会经常尝试切换线程。

尝试缓冲工作队列,并在累积大量工作后发送信号。

如果由于任务之间的依赖性而无法实现,那么您的应用程序根本不适合多线程。

答案 1 :(得分:0)

为了在多线程应用程序中获得性能,产生与CPU一样多的线程,而不是每个任务的单独线程。否则,你最终会从上下文切换中获得大量开销。

您还可以考虑使您的算法更加线性(即使用非阻塞调用)。