Мне нужно создать вектор из k элементов. Каждый поток будет создавать свою часть, скажем, k * 25% и должен поместить ее в вектор по любому индексу. Изгнанные из этой example я собирался сделать что-то вроде этого:Заполнение вектора параллельно, не важно
std::atomic<std::vector<aClass<templatedType>>> H;
, но это не будет работать:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/atomic:823:13: error:
_Atomic cannot be applied to type
'std::__1::vector<StableHashFunction<int>,
std::__1::allocator<StableHashFunction<int> > >' which is not trivially
copyable
mutable _Atomic(_Tp) __a_;
, так как это не тривиально копируемыми - и обходной путь не мила. Кроме того, мне нужно, чтобы он был атомарным?
Это вопрос, когда меня не волнует порядок, должен ли я использовать атом? Другими словами, выполняют ли данные скачки только порядок элементов, или они могут вызывать другие побочные эффекты, например, уклонение элемента (поэтому вместо k элементов в конце есть только k-1)?
'push_back()' или 'emplace_back()' не атомарные операции, таким образом, вы должны защищать их с какой-то механизм синхронизации как 'станд :: mutex'. –
Создайте вектор размера K, затем каждую часть обновления потока вектора, чтобы вы не делили данные между потоками. – Jarod42
@ Jarod42 Это была моя первая мысль, но для этого вам нужно по умолчанию построить все элементы в векторе. – NathanOliver