【发布时间】:2019-05-15 15:59:47
【问题描述】:
我正在尝试并行化我的程序,但由于我对线程非常陌生,因此遇到了一些问题。
我有两个属于同一个类的方法。其中一种方法在 for 循环中进行一些计算并将结果推送到向量中,另一种方法 (runTheResult) 获取向量并使用获得的向量启动线程。我希望每次 runTheResult 完成一个结果时启动另一个线程来运行下一个获得的结果,同时将一次最大线程数限制为 4。
我的程序结构是这样的:
void runTheResult(vector<double>& u){
//process 'u' and launch a thread
};
void method(){
for(...){
//calculate
for(...){
//put the calculations in vector<double>result
};
runTheResult(result);
};
};
我在谷歌上搜索了很多,其中一个解决方案是维护一个消息队列。然而,这个问题是如果我实现一个队列,我将不得不在一个while循环中定期用另一个线程检查队列。如果我使用像while(true){//check for new messages if number of threads is less than five} 这样的while 循环,我会失去很多处理能力,如果我选择在不满足条件的情况下让循环进入睡眠状态,我会浪费处理能力。我在线程中运行的函数每个需要 2-5 秒,我必须处理大约 1k 到 50k 的函数,所以即使每个循环延迟一秒也很多。
是否可以在每次 runTheResult 完成时在另一个线程中运行 runTheResult?还是有更好的方法来做到这一点?
【问题讨论】:
-
你可以让另一个线程等待一个条件变量并唤醒它,然后根据你将设置的一些标志执行你想要的函数。在 Windows 中,您还可以拥有一个消息队列并发布一条消息(不是您创建的 for 循环,而是 GetMessage())。对于简单的多线程计算,您还可以使用 future/promise。
-
创建4个线程,让它们等待一个条件变量。每次您为其中一个线程准备好工作时,请致电
notify_one。 -
@MichaelChourdakis 如果我检查标志,我仍然必须使用 while 循环,对吗?如果您不介意,您能详细说明一下吗?
-
重点是,通过使用这些“等待”对象,for循环不会消耗系统资源。如果您在条件变量上等待,那么在等待时线程不会占用 CPU。您将执行一个 for 循环,但在其中您将检查条件变量,如果已设置,then 检查标志。
-
在我的一篇较早的文章here中获得更多信息。
标签: c++ multithreading c++11 parallel-processing