Как два стандартные алгоритмы, такие как перегородки и сортировка выполняются форма 2 различной тема, в то же время является handeled с помощью параллельных контейнеров (например, в boost или tbb реализации)?Как блокированные контейнеры реагируют на одновременное разбиение и сортировку?
ответ
У Boost есть свободные очереди и стопка. Они не сортируют и не разделяют их.
На поверхностный осмотр документации, ТВВ имеет concurrent_hash_map и классы очередей, для которых то же самое относится.
Только concurrent_vector
от TBB поставил бы этот вопрос. В документах описывают его следующим образом:
concurrent_vector<T>
является динамически расширяемым массивом изT
Тем не менее, только для хранения (перо) распределение является lockfree потокобезопасно, а не сами элементов;
concurrent_vector никогда не перемещает элемент до тех пор, пока массив не будет очищен, что может быть преимуществом над STL станд :: вектор даже для однопоточных код
И
операций on concurrent_vector - это параллелизм в отношении роста, а не для очистки или уничтожения вектора. Никогда не вызывайте метод clear(), если есть другие операции в полете на concurrent_vector.
Поэтому, если вы хотите отсортировать concurrent_vector вы можете
- хотите взаимоисключают доступа; если задержка имеет решающее значение вы можете использовать атомный спинлок вместо fullblown мьютекса, но в любом случае вам нужно синхронизация
- рассмотреть вопрос о копировании в отсортированный диапазон оставляя записи исходных неизмененными; это можно сделать без дополнительной блокировки (при условии, что операции чтения на векторных элементах являются потокобезопасными), см., например,
std::partial_sort_copy