我有一个用于存储一些结果的容器。说,
std::vector<double> allResults
,我有一堆线程正在努力获得这些结果,并将其存储在容器中。每个线程的任务是获得多个但互不相同的结果。
避免虚假共享的最佳方法是什么?
可以简单地让一个线程对一个结果执行其工作,然后说
allResults[index] = //insert thread's result
因为每个线程都在索引上工作,而没有其他线程可以共享?
或者我应该做些不同的事情,例如为每个线程创建一个单独的向量:
std::vector<double> vectorForEachThread
然后每个线程将其结果添加到该向量,然后在完成所有操作后,以某种方式组合这些向量?
答案 0 :(得分:0)
如果结果属于某些线程间任务,则每个任务应通过消息系统将其自身的结果返回给请求者线程,比如说回调。
如果结果显示某种状态,则该参数应该只能从一个对象(或线程)写入,并且可以被许多对象读取。这些样式将使您免于无休止的竞争条件调试会话。
如果您的结构不能接受这种样式,则可以考虑进行重构。
最后,请避免从全局变量执行此类任务。使它们成为线程间消息。