在C++中执行单个任务的多线程

Multithreading to perform a single task in C++

本文关键字:任务 多线程 单个 执行 C++      更新时间:2023-10-16

假设我有一个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,您需要将"大任务"拆分为多个块,这些块可以在同一时间执行,并且不会相互影响。

一般流程:

  1. 把大块的东西放进一个容器里。将其状态设置为"可用"
  2. 根据需要创建任意数量的线程(CPU核心的实际数量为有用)
  3. 这是线程函数。它们是并行执行的。

    1. 尝试从容器并使其"繁忙"。若并没有找到"可用"区块,退出线程
    2. 处理区块并使其"准备就绪"
    3. 返回(4)
  4. 在主线程中,等待所有工作线程完成。您可以在循环中等待每一步睡眠一秒钟,检查是否按下了Ctrl-C。或者在所有线程上简单地"联接"(等待线程退出)。

  5. 将所有的块聚集在一起,并使用计算结果

请注意,您需要注意访问同一数据的多个线程,因为它们可能会相互干扰。例如,多个线程可能在同一时间占用同一块进行处理。这个问题可以通过互斥来解决(请参阅boost::mutex)。

解决这个问题还有其他方法。您可以将块放入消息队列(FIFO),然后让线程将它们从队列中弹出,并将结果放入其他队列。如果你在网络上扩展这个队列,你可以雇佣几台电脑来完成这项工作。

为了便于移植,您可以使用boost::thread。

这也很有用:boost::thread_group