2015-03-06 3 views
0

Как два стандартные алгоритмы, такие как перегородки и сортировка выполняются форма 2 различной тема, в то же время является handeled с помощью параллельных контейнеров (например, в boost или tbb реализации)?Как блокированные контейнеры реагируют на одновременное разбиение и сортировку?

ответ

1

У 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