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

时间:2015-11-19 08:21:18

标签: c++ multithreading

假设我有这个big_task()函数,我可以在线程之间拆分以加速。

使用多线程解决该问题的方法是在函数的每个任务上调用_beginthread(),然后等待所有线程完成,对吧?

我如何知道这样做是否有效并且实际上有利于最小化big_task()运行时间?

我还听说多线程效率取决于客户端的平台和硬件。这意味着我需要在程序开头查询一些东西..?

在Windows中进行编码时,还有一个问题是,使用CreateThread()而不是_beginthread()会更好吗?我编写了跨平台应用程序,但如果CreateThread()比我专用我的代码在Windows中使用它更有效。

2 个答案:

答案 0 :(得分:5)

  

解决多线程问题的方法是在函数的每个任务上调用_beginthread(),然后等待所有线程完成,对吗?

这样你就可以并行化你的大函数,所以是的,这是真的。

  

我如何知道这是否有效并且实际上有利于最小化big_task()运行时间?

您必须对其进行分析。如果你的大功能是在CPU没有I / O操作上执行代码,那么考虑创建与CPU中核心数相同数量的线程。

  

我还听说多线程效率取决于客户端的平台和硬件。这意味着我需要在我的程序开头查询...?

具有更多内核的CPU肯定会比具有更少内核的CPU更快,您可以查看PPL(仅限win),TBB,OpenMP库,以确保根据CPU内核的数量高效运行任务。

  

还有一个问题,在Windows中进行编码时,使用CreateThread()而不是_beginthread()会更好吗?我编写跨平台应用程序但是如果CreateThread()比我专门化我的代码在Windows中使用它更有效。

如果您想要跨平台,那么请使用std :: thread或boost。

答案 1 :(得分:2)

我希望这会帮助你开始。

要实现单线程方法的加速,您需要多核CPU。在单核CPU上,额外的线程不会提高计算速度,但在进行CPU密集型工作的同时,它可能有助于使其他功能在同一时间顺利运行(例如GUI)。

要使用多核CPU,您需要将“大任务”拆分为可以在同一时间执行而不会相互影响的块。

一般流程:

  1. 将块放入容器中。将其状态设置为“可用”。
  2. 根据需要创建尽可能多的线程(最多可达到CPU核心数) 有用)。
  3. 这是线程功能。它们是并行执行的。

    1. 尝试从中获取第一个“可用”块 容器,让它“忙”。如果找不到“可用”块,则退出线程。
    2. 处理块并使其“准备就绪”。
    3. 返回(4)
  4. 在主线程中等待所有工作线程完成。您可以在每个步骤中等待一个循环,然后检查是否按下了Ctrl-C。或者只是在所有线程上“加入”(等待线程退出)。

  5. 将所有块组合在一起并使用计算结果。
  6. 请注意,您需要处理访问相同数据的多个线程,因为它们可能会相互干扰。例如,多个线程可以同时采用相同的块进行处理。 可以使用互斥锁解决此问题(请参阅boost::mutex)。

    此问题还有其他方法。您可以将块放入消息队列(FIFO)中,让线程将它们从队列中弹出并将结果放入其他队列中。如果您通过网络扩展此队列,则可以使用多台PC来完成工作。

    为了便于携带,您可以使用boost::thread

    这也很有用:boost::thread_group