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

C++ 在C+;中执行单个任务的多线程+;,c++,multithreading,C++,Multithreading,假设我有一个big_task()函数,可以在线程之间拆分以提高速度 解决多线程问题的方法是在函数的每个任务上调用\u beginthread(),然后等待所有线程完成,对吗 我如何知道这样做是否有效率,是否真正有利于最小化big_task()运行时间 我还听说多线程的效率取决于客户端的平台和硬件。这意味着,在我的程序开始时,我也需要查询它 还有一个问题,在Windows中编码时,使用CreateThread()是否比使用\u beginthread()更好?我编写跨平台应用程序,但如果Creat

假设我有一个
big_task()
函数,可以在线程之间拆分以提高速度

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

我如何知道这样做是否有效率,是否真正有利于最小化
big_task()
运行时间

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

还有一个问题,在Windows中编码时,使用
CreateThread()
是否比使用
\u beginthread()
更好?我编写跨平台应用程序,但如果
CreateThread()
的效率高于我可以专门化代码以在Windows中使用它的效率

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

这样,您将并行化您的大函数,所以是的,这是真的

我如何知道这样做是否有效,是否有利于最大限度地减少大任务()的运行时间

你必须分析它。如果你的大功能是在CPU的I/O操作上执行代码,那么考虑在CPU中创建与线程数相同的线程数。 我还听说多线程的效率取决于客户端的平台和硬件。这意味着,在我的程序开始时,我也需要查询它

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

还有一个问题,在Windows中编码时,使用CreateThread()是否比使用_beginthread()更好?我编写跨平台的应用程序,但如果CreateThread()的效率高于我的代码,我可以在Windows中专门使用它


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

我希望这将帮助您开始

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

要利用多核CPU,您需要将“大任务”划分为块,这些块可以同时执行,并且不会相互影响

一般流程:

  • 把这些块放进一个容器里。将其状态设置为“可用”
  • 创建任意数量的线程(最多可创建实际数量的CPU内核) 有用)
  • 这是线程函数。它们是并行执行的

  • 尝试从列表中获取第一个“可用”块 容器并使其“忙碌”。如果找不到“可用”区块,则退出线程
  • 处理区块并使其“准备就绪”
  • 回到(4)
  • 在主线程中,等待所有工作线程完成。您可以在循环中等待,每一步睡眠一秒钟,检查是否按下Ctrl-C。或者在所有线程上简单地“join”(等待线程退出)

  • 将所有数据块聚集在一起,并使用计算结果
  • 请注意,您需要注意多个线程访问同一数据,因为它们可能相互干扰。例如,多个线程可以在同一时间获取相同的块进行处理。 这个问题可以通过互斥来解决(请参阅)

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

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


    这也很有用:

    你能解释一下任务的类型吗?(网络、数据库访问、磁盘io、cpu时间?)如果您使用C++11,我相信您可以使用
    std::thread
    。首先,如果您使用的是多处理器/多核系统,当然多线程会更快。@AlexandreLavoie:只有当这些任务可以并行执行时;-)@如果你满意,你应该接受其中一个答案。这不需要是我的答案;-)@Pilpel因为其windows唯一的函数,在linux下等价于pthreads库。线程将在windows、linux、@Pilpel上工作不,它不是-它只是不跨平台。有关CreateThread和_beginthreadex之间的差异,请阅读此处:。我明白了。最后一个要确定的问题是:C++11代码可以在C++03工作的任何平台上工作,对吗?@Pilpel是的,你只需要一个与C++11兼容的编译器就可以了。Boost很方便,因为它是多平台的。您可以为Linux和Windows构建boost库。如果愿意,您可以在Qt Creator中拥有相同的项目(项目文件中的开关很少),该项目将在多个平台上编译和调试。boost中有更多有用的东西,比如共享的ptr和asio。当然,现在C++11中提供了共享的ptr。