假设我有这个big_task()
函数,我可以在线程之间拆分以加速。
使用多线程解决该问题的方法是在函数的每个任务上调用_beginthread()
,然后等待所有线程完成,对吧?
我如何知道这样做是否有效并且实际上有利于最小化big_task()
运行时间?
我还听说多线程效率取决于客户端的平台和硬件。这意味着我需要在程序开头查询一些东西..?
在Windows中进行编码时,还有一个问题是,使用CreateThread()
而不是_beginthread()
会更好吗?我编写了跨平台应用程序,但如果CreateThread()
比我专用我的代码在Windows中使用它更有效。
答案 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,您需要将“大任务”拆分为可以在同一时间执行而不会相互影响的块。
一般流程:
这是线程功能。它们是并行执行的。
在主线程中等待所有工作线程完成。您可以在每个步骤中等待一个循环,然后检查是否按下了Ctrl-C。或者只是在所有线程上“加入”(等待线程退出)。
请注意,您需要处理访问相同数据的多个线程,因为它们可能会相互干扰。例如,多个线程可以同时采用相同的块进行处理。 可以使用互斥锁解决此问题(请参阅boost::mutex)。
此问题还有其他方法。您可以将块放入消息队列(FIFO)中,让线程将它们从队列中弹出并将结果放入其他队列中。如果您通过网络扩展此队列,则可以使用多台PC来完成工作。
为了便于携带,您可以使用boost::thread。
这也很有用:boost::thread_group