2010-09-20 4 views
1

Теперь у меня есть решатель, что мне нужно сохранить набор самоопределенных объектов типа данных в concurrent_vector или очереди. Он должен быть параллельным, потому что объекты происходят из разных потоков. С этим параллельным контейнером я надеюсь отсортировать эти объекты, устранить дубликаты и отправить их обратно, когда им понадобятся другие потоки.Как сортировать TBB concurrent_vector или concurrent_queue?

Однако, я знаю, что TBB предлагает concurrent_vector и concurrent_queue, которые можно читать и записывать одновременно из разных потоков. Но как сортировать объекты внутри контейнера? Все знают, как это сделать? Благодарю.

ответ

0

Я думаю, что потоки производителей должны запускаться одновременно с потребительскими потоками. Так что, если элементы не нужно сортировать и делать уникальными, достаточно простого concurrent_queue.

Если вам нужно только сделать их уникальными, вы можете использовать для этого tbb::concurrent_hash_map.

Однако, если вы действительно хотите отсортировать элементы, вам понадобится нечто вроде concurrent_set (упорядоченное), которое довольно сложно и не существует в tbb. Итак, если вам действительно нужно отсортировать эти элементы, я бы предложил использовать простой замок, который должен быть собран для размещения элементов в вашем контейнере (например, std :: set) и для извлечения их из него.

3

Я думаю, что у вас есть некоторое непонимание TBB параллельного контейнера. Вы можете обратиться к TBB wiki

Существуют ли в параллельных контейнерах TBB объекты синхронизации ОС?

  • Нет, они этого не делают. В параллельных контейнерах TBB используются примитивы синхронизации на уровне пользователя TBB и атомарные операции.

Безопасна ли она для доступа и изменения элементов tbb::concurrent_vector без блокировки?

  • Нет, вы должны использовать блокировки явно.

Следовательно, concurrent_vector не поддерживает поточно-многопоточное чтение и запись. Надеюсь, эта помощь.

+0

Данная ссылка является borken. – user

+0

:), просто исправил это. Недавно они изменили структуру веб-сайта. Спасибо, что указали это. –

1

concurrent_vector работает с std :: sort и обоими tbb & ppl (in the sample pack) предлагает параллельные сорта, которые могут быть использованы с этим. Параллельная версия std :: unique будет еще более полезна для удаления обманов, но вам придется создавать свои собственные.

 Смежные вопросы

  • Нет связанных вопросов^_^