频繁暂停和重启线程的最佳方法是什么?
C++ What is the best way to frequently pause and restart threads?
我有一个任务,这是非常好的并行化,所以我想使用多个线程来加快我的程序。然而,这并不像创建线程并让它们运行那么简单。线程必须重复执行某个任务,中间有中断,即伪代码看起来像这样:
loop
wake threads up
calculate x using the threads
pause threads
calculate something else without the threads
这种情况发生得非常频繁,准确地说是每秒60次。这就是为什么每次创建新线程都太慢的原因。我尝试用每个线程的状态变量(运行,暂停,停止)和带有条件变量的类似事件的构造或轮询机制来解决这个问题。
这两种方法都只给了我大约两倍的速度,考虑到只有大约5%的时间是在临界区域内花费的,这并不是我想象的那么多。(我的CPU提供4核* 2 = 8超线程)
我认为条件变量的问题是唤醒不是立即的,而是有一些延迟,这意味着运行时间浪费。轮询方法稍微慢一些,我猜是因为线程暂停时执行的代码会慢一些,因为线程仍然在使用CPU。
实现我所想到的最好的方法是什么?
如果您希望线程阻塞直到发生某些事情,您可以将std::mutex
(其锁由std::unique_lock<std::mutex>
持有)与std::condition_variable
配对。
使用std::condition_variable
的wait
成员,传递std::unique_lock<std::mutex>
和一个函子,当满足线程唤醒的条件时返回true
。当线程等待std::condition_variable
时,它会交出锁。当条件满足时,notify_one
(假设有问题的线程是为通知而选择的线程)或notify_all
在std::condition_variable
上被调用,它将唤醒,重新获取锁,检查条件,并在/如果为真时返回(锁仍然持有)。
您可以使用英特尔TBB。如果你的任务足够简单,你可以使用像parallel_for
这样的简单算法。(parallel_for
更容易与lambas: https://software.intel.com/en-us/blogs/2009/08/03/parallel_for-is-easier-with-lambdas-intel-threading-building-blocks)
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?