Как отсортировать TBB concurrent_vector или concurrent_queue? - PullRequest
1 голос
/ 20 сентября 2010

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

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

Ответы [ 3 ]

3 голосов
/ 05 октября 2011

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

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

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

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

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

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

1 голос
/ 15 октября 2011

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

0 голосов
/ 08 декабря 2010

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

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

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

...