我正在尝试通过设置后台线程来解决一个特定任务来加速一段代码。当我需要解决我的任务时,我想唤醒这些线程,完成工作并再次阻止它们等待下一个任务。任务总是一样的。
我尝试使用条件变量(以及需要与它们一起使用的互斥锁),但最终我减慢了代码速度,而不是加快速度;主要是因为调用所有需要的函数非常昂贵(pthread_cond_wait/pthread_cond_signal/pthread_mutex_lock/pthread_mutex_unlock
)。
使用线程池(我没有)是没有意义的,因为它是一个过于通用的构造;在这里,我只想解决我的具体任务。根据实现情况,我还会为队列支付性能损失。
对于在不使用mutex
或con_var
的情况下快速唤醒,您有什么建议吗?
我正在考虑设置线程,比如定时器读取atomic variable
;如果变量设置为1,则线程将完成工作;如果它被设置为0,它们将进入睡眠状态几微秒(我将从微秒睡眠开始,因为我想避免使用可能对CPU来说太贵的spinlocks
)。你怎么看待这件事?任何建议都非常感谢。
我使用的是Linux,gcc,C和C ++。
答案 0 :(得分:4)
这些功能应该很快。如果他们占用了你很大一部分时间,你很可能会经常尝试切换线程。
尝试缓冲工作队列,并在累积大量工作后发送信号。
如果由于任务之间的依赖性而无法实现,那么您的应用程序根本不适合多线程。
答案 1 :(得分:0)
为了在多线程应用程序中获得性能,产生与CPU一样多的线程,而不是每个任务的单独线程。否则,你最终会从上下文切换中获得大量开销。
您还可以考虑使您的算法更加线性(即使用非阻塞调用)。