Я работаю над многопоточной программой, где все потоки разделяют некоторый вектор (только для чтения). Цель каждого потока - перемещение всего вектора. Тем не менее, все потоки должны посещать этот вектор по-другому.
Так как вектор является const и разделяется между всеми потоками, я не могу использовать random_shuffle и просто перебирать его. На данный момент я решил построить вектор crossref, который будет содержать индексы над общим вектором, а затем перетасовать этот вектор, т.е.
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), это не очень эффективно, так как каждый поток должен получить доступ к своему вектору crossref перед тем, как получить доступ к общему, (2) у меня возникли некоторые проблемы с производительностью из-за объема требуемой памяти: общий вектор очень большой, и у меня много потоков и процессоров.
Есть ли у кого-нибудь идеи по улучшению, которые позволят избежать дополнительной памяти?