Я работаю над многопоточной программой, где все потоки разделяют вектор (только для чтения). Цель каждого потока - перемещение всего вектора. Тем не менее, все потоки должны посещать этот вектор по-другому.C++ повторить вектор случайным образом
Поскольку вектор является 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) у меня есть некоторые проблемы с производительностью из-за объема требуемой памяти: общий вектор очень большой, и у меня много потоков и процессоров.
Есть ли у кого-то идеи по улучшению, которые позволят избежать дополнительной памяти?
Доступ к 'std :: vector' выполняется в O (1), так как это произвольный доступ. Также вам не гарантируется, что все потоки будут иметь разные 'crossref'' std :: vector', так что может случиться так, что два потока будут перебирать вектор таким же образом. – Zereges
Я бы использовал один перетасованный индексный стек, общий для всех потоков, который защищен от одновременного доступа. –
@Zereges - Конечно, проблема заключается в том, что общий вектор почти подходит кешу, поэтому каждый раз, когда поток обращается к вектору crossref, он будет аннулировать кеширование, и это не эффективно. – Esus