并行计算只有最快的解决方案"赢得"C++

The*_*PMO 4 c++ multithreading

我正在编写一个程序,一次创建多个线程(5-20​​),以并行计算单个问题的迭代.现在,这些线程中的任何一个都可以提供有效的解决方案,此时应该将此解决方案(以对象引用的形式)报告回主线程以停止所有其他线程并基于此解决方案创建新线程.

找到解决方案后,主线程快速响应以停止/暂停线程并处理解决方案至关重要.

我已经研究了观察者模式,C++ 11的std::async方法和std::future/ promise对象,但通常这些例子都会期望所有线程的结果然后被收集和处理.在我的应用程序中,只有一个"赢家"线程可以提供解决方案,但我事先无法知道它将是哪一个.

由于我是并行编程的新手,我想知道实现这个的最佳方法是什么?使主线程等待多个其他线程/并行任务中的一个结果的最有效方法是什么?

编辑澄清:我有一个需要分析的实时信号.我有不同的算法可以确定系统的不同状态的子集."获胜"算法将信号与这些类别之一进行匹配,因此当前系统状态是已知的.根据当前状态,系统将来可能会进入不同的状态,这也需要进行检测.目前,所有这些算法在循环中顺序运行,直到可以找到拟合类别,此时主线程设置后续检测间隔的参数.但是通过并行计算这种不同的算法,我可以大大提高效率.

Com*_*sMS 5

这里要考虑两件事:您需要从工作线程到主线程的通信通道,以通知已计算结果.并且您需要从主线程到工作线程的通信通道,以便在其他线程找到结果后请求较慢的线程中止其计算.

注意,这两个通信信道以不同方式使用.从工作者到主线程的通知是一个事件:主线程应该阻塞,直到它从最快的线程收到结果通知,然后唤醒并立即继续.从主线程到剩余工作人员的通知是不同的:工作人员已经忙于执行计算,他们只是不时检查是否应该中止.所以他们想要进行民意调查.我们还希望尽可能地消除通信通道上的并发性,这样我们就不会使工作线程的速度超过必要的速度.

第一种通知是一个很好的匹配condition_variable.保留由所有线程共享的单个结果缓冲区.一旦工作人员完成,它就会锁定保护结果缓冲区的互斥锁,检查是否已存储结果,如果没有,则将其结果复制到缓冲区并通知condition_variable.主线程等待相同的条件变量.请注意,即使线程都共享相同的条件变量和结果缓冲区,这里几乎没有并发性,因为我们希望线程在不同时间完成计算,并且主线程实际上在整个时间都在休眠,等待通知来自条件变量.

对于轮询,您可以使用atomic在一个工作线程和主线程之间共享的变量.一旦主线程检索到其结果,它就会为所有工作者设置原子变量.工人定期检查他们的原子变量是否已设定,如果是,则中止他们的计算.请注意,此处需要权衡您想要执行轮询的频率.轮询过于频繁,而且工人的开销很大.民意调查太少,你的工人对堕胎请求的反应较少.