c++ - 不使用条件变量唤醒线程的最快方法

标签 c++ c multithreading performance atomic

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

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

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

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

我在考虑设置线程,比如定时器读取一个原子变量;如果变量设置为 1,线程将完成工作;如果它设置为 0,它们将休眠几微秒(我会从微秒休眠开始,因为我想避免使用 spinlocks,这对 CPU 来说可能太昂贵了)。你怎么看待这件事?非常感谢任何建议。

我正在使用 Linux、gcc、C 和 C++。

最佳答案

这些功能应该很快。如果它们占用了您的大部分时间,则很可能是您尝试过于频繁地切换线程。

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

如果由于任务之间的依赖关系而无法做到这一点,那么您的应用程序根本不适合多线程。

关于c++ - 不使用条件变量唤醒线程的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5593035/

相关文章:

c++ - 为什么在模板类静态辅助函数中调用全局函数会导致链接器错误,但在非静态成员函数中不会调用?

c - FFmpeg:无法使用 Ffmpeg 库函数解码 H264 编码文件

java - 在线程上调用不同的方法

c - while循环无明显原因停止

c - 指向带有 malloc 的 Scanf 的指针,不可预测的结果

java - 使用 java.util.concurrent 类时我什么时候应该担心虚假唤醒

java - 如何在同一 Java 流中正确提交和获取多个 Futures?

c++ - 访问共享内存映射文件 View 的数量 (Windows)

c++ - SDL 插件库未正确链接

c++ - 仅显示 1 个 opengl 3d 立方体