我正在编写一个多线程程序,所有线程共享一些向量(只读)。每个线程的目标是遍历整个向量。然而,所有线程必须以不同的方式访问该向量。
由于该向量是const并且在所有线程之间共享,因此我不能使用random_shuffle并仅对其进行迭代。目前我的解决方案是构建一个交叉引用向量,其中包含共享向量上的索引,然后随机打乱该向量,即:
std::vector<int> crossref(SIZE) ; // SIZE is the size of the shared vector
std::iota (std::begin(crossref), std::end(crossref), 0); // Fill with indices ref
std::mt19937 g(SEED); // each thread has it own seed.
std::shuffle (crossref_.begin(), crossref_.end(), g); // Shuffle it
然而,这样做会揭示一些问题:(1)效率不高,因为每个线程在访问共享变量之前都需要访问其交叉引用向量,(2)由于所需存储的内存量很大,我遇到了一些性能问题:共享向量非常大,而且我有很多线程和处理器。
有没有人有一些改进的想法,可以避免需要额外的内存?
std::vector
的时间复杂度为O(1),因为它支持随机访问。同时,并不能保证所有线程都有不同的crossref
std::vector
,因此可能发生两个线程以相同方式迭代向量的情况。 - Zereges