在C++中执行单个任务的多线程
Multithreading to perform a single task in C++
假设我有一个big_task()
函数,为了加速,我可以在线程之间分割它。
用多线程解决这个问题的方法是在函数的每个任务上调用_beginthread()
,然后等待所有线程完成,对吧?
我怎么知道这样做是否有效,是否有利于最大限度地减少big_task()
的运行时间?
我还听说多线程的效率取决于客户端的平台和硬件。这意味着这也是我在程序开始时需要查询的内容。。?
还有一个问题,当在Windows中编码时,使用CreateThread()
而不是_beginthread()
更好吗?我编写跨平台的应用程序,但如果CreateThread()
比我更高效,我可以专门化我的代码在Windows中使用它。
用多线程解决这个问题的方法是对函数的每个任务调用_beginthread(),然后等待所有线程完成,对吧?
通过这种方式,您将并行化您的大函数,所以是的,这是真的。
我怎么知道这样做是否有效,是否有利于最大限度地减少big_task()的运行时间?
如果你的大函数在没有I/O操作的CPU上执行代码,那么考虑创建与CPU内核数量相同的线程数量。
我还听说多线程的效率取决于客户端的平台和硬件。这意味着这也是我在程序开始时需要查询的内容。。?
拥有更多内核的CPU肯定会比拥有更少内核的CPU更快,您可以查看PPL(仅限获胜)、TBB、OpenMP库,这些库可以确保根据CPU内核的数量高效运行任务。
还有一个问题,在Windows中进行编码时,使用CreateThread()而不是_beginthread()更好吗?我编写跨平台应用程序,但如果CreateThread()比我在Windows中专门化代码更高效。
如果您想要跨平台,请使用std::thread或boost。
我希望这将帮助您入门。
要在单线程方法上实现加速,您需要多核CPU。在单核CPU上,额外的线程不会提高计算速度,但它可能有助于在进行CPU密集工作的同时使其他功能(如GUI)顺利工作。
要使用多核CPU,您需要将"大任务"拆分为多个块,这些块可以在同一时间执行,并且不会相互影响。
一般流程:
- 把大块的东西放进一个容器里。将其状态设置为"可用"
- 根据需要创建任意数量的线程(CPU核心的实际数量为有用)
-
这是线程函数。它们是并行执行的。
- 尝试从容器并使其"繁忙"。若并没有找到"可用"区块,退出线程
- 处理区块并使其"准备就绪"
- 返回(4)
-
在主线程中,等待所有工作线程完成。您可以在循环中等待每一步睡眠一秒钟,检查是否按下了Ctrl-C。或者在所有线程上简单地"联接"(等待线程退出)。
- 将所有的块聚集在一起,并使用计算结果
请注意,您需要注意访问同一数据的多个线程,因为它们可能会相互干扰。例如,多个线程可能在同一时间占用同一块进行处理。这个问题可以通过互斥来解决(请参阅boost::mutex)。
解决这个问题还有其他方法。您可以将块放入消息队列(FIFO),然后让线程将它们从队列中弹出,并将结果放入其他队列。如果你在网络上扩展这个队列,你可以雇佣几台电脑来完成这项工作。
为了便于移植,您可以使用boost::thread。
这也很有用:boost::thread_group
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 如何在C++中创建高效的多线程任务计划程序
- 在多线程中调度任务
- 对于多线程应用程序中的显示任务,原子锁或互斥锁是必须的吗
- C++REST SDK:异步任务与C++11多线程
- C++:多线程设计,每个线程都应该同时执行I/O和CPU密集型任务
- 在C++中执行单个任务的多线程
- 多线程递归任务同步
- 多线程任务总体进度报告的设计模式
- 多线程——希望是一项简单的任务