Простой контейнерный класс C ++, который является потокобезопасным для записи - PullRequest
3 голосов
/ 21 апреля 2010

Я пишу многопоточную программу с использованием OpenMP на C ++. В какой-то момент моя программа разветвляется на множество потоков, каждый из которых должен добавить «задания» в некоторый контейнер, который отслеживает все добавленные задания. Каждое задание может быть просто указателем на какой-либо объект.

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

Есть ли простое решение, которое хорошо работает? После некоторого поиска в Google я обнаружил, что контейнеры STL не являются потокобезопасными. Некоторые потоки stackoverflow решают этот вопрос, но ни один из них не формирует консенсуса по простому решению.

Ответы [ 2 ]

7 голосов
/ 22 апреля 2010

Нет встроенного способа сделать это.Вы можете просто использовать блокировку для защиты одного из существующих типов контейнеров.Лучше было бы, чтобы каждый поток использовал свой собственный контейнер, а затем объединял результаты в конце.

1 голос
/ 22 апреля 2010

Использование мьютекса или аналогичного примитива синхронизации для управления доступом к связанному списку не очень сложно, поэтому я рекомендую вам сначала попробовать.

Если он работает так плохо, что вы не можете его использовать, попробуйте это: предоставьте каждому потоку свою очередь заданий и попросите потребителя заданий проверить все очереди по очереди. Таким образом, в каждой очереди только один читатель и один писатель, поэтому реализация без блокировок относительно проста. Я имею в виду, что это может существовать для вашей платформы; Вы не должны пытаться написать это самостоятельно.

...