Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用多个线程在向量上迭代(无数据共享或向量修改)_C++_Multithreading_Iteration - Fatal编程技术网

C++ 使用多个线程在向量上迭代(无数据共享或向量修改)

C++ 使用多个线程在向量上迭代(无数据共享或向量修改),c++,multithreading,iteration,C++,Multithreading,Iteration,我有一个很大的对象向量,我只需要使用多个线程在向量上迭代并读取对象(不修改数据或向量)。最有效的方法是什么?是否可以用无锁的方式实现,或者使用原子变量?这种多线程过程的最易于阅读的实现是什么 编辑: 我不希望有多个线程读取向量的同一元素(在这种情况下,读取非常耗时)。当一个线程正在读取一个元素时,我希望下一个线程读取第一个尚未读取的元素。例如,当线程1读取对象1时,我希望线程2读取对象2。只要完成其中一项操作,它就可以读取对象3,依此类推 将输入分成相等的部分非常容易,它不使用锁,也不会导致内存

我有一个很大的对象向量,我只需要使用多个线程在向量上迭代并读取对象(不修改数据或向量)。最有效的方法是什么?是否可以用无锁的方式实现,或者使用原子变量?这种多线程过程的最易于阅读的实现是什么

编辑:
我不希望有多个线程读取向量的同一元素(在这种情况下,读取非常耗时)。当一个线程正在读取一个元素时,我希望下一个线程读取第一个尚未读取的元素。例如,当线程1读取对象1时,我希望线程2读取对象2。只要完成其中一项操作,它就可以读取对象3,依此类推

将输入分成相等的部分非常容易,它不使用锁,也不会导致内存共享。所以试试看,测量每个线程需要完成的时间,并检查是否有相关的差异

如果差异是相关的,考虑每个元素使用一个代码>原子< /代码>的数组,在读取元素之前,线程在与该元素相关的标志上执行<代码> COMPARIEXExchange EXECUTION/CONDE>。(我认为您甚至可以使用

内存\u顺序\u release
,但首先使用
内存\u顺序\u acq\u rel
,只有在性能不满足时才尝试使用release)并且只有在交换成功的情况下才实际处理该元素,否则它会尝试处理下一个元素,因为有人正在处理或已经处理了当前元素

如果不能,则可以使用单个
原子
来存储要处理的下一个元素的索引。线程只需使用
fetch\u add
或postfix++以原子方式获取要处理的下一个元素并递增计数器(内存排序的注意事项与上面相同)。如果读取时间的差异较大(由步骤1确定),则原子变量的争用率较低,因此它的性能良好


如果争用仍然太高,并且速度明显减慢,请尝试提前估计读取一个元素所需的时间。如果可以,则按估计的读取时间对向量进行排序,并使第n个线程读取每个第n个元素,以便更均匀地分配负载。

如果没有修改,则只读取t数据。如果一个线程修改它,而另一个线程可能正在访问它,则只需要同步或原子性。我不希望多个线程读取向量的同一元素(在这种情况下,读取很耗时)。当一个线程读取一个元素时,我希望下一个线程读取第一个尚未读取的元素。例如,当线程1读取对象1时,我希望线程2读取对象2。每当其中一个线程完成时,它都可以读取对象3,依此类推。你能给每个线程一个不同的向量范围来处理吗?然后将其拆分为更小的块并使用基于任务的方法。如果一个线程完成其任务,它将从下一个块开始。可能使用
std::async
或您自己的线程池。您可以同步保存下一个可用索引的变量,并在所有线程之间共享该索引。然后每个线程获取变量的值,并在n它将从向量执行下一次读取。在任何情况下,不要使用锁,因为你不需要它。在我的电脑上,仅在500个线程上增加一个原子变量比增加一个由锁保护的非原子变量快5倍。谢谢你Giulio。这就是我一直在寻找的!