Нужно ли блокировать список STL с помощью мьютекса в сценарии push_back pop_front? - PullRequest
7 голосов
/ 05 февраля 2009

У меня есть поток, возвращающийся в список STL, и другой поток, появляющийся из списка. Нужно ли блокировать список с помощью мьютекса в таком случае?

Ответы [ 5 ]

11 голосов
/ 05 февраля 2009

С STL SGI по безопасности потоков :

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

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

3 голосов
/ 05 февраля 2009

Большинство реализаций STL поточно-ориентированы в том смысле, что вы можете получить доступ к нескольким экземплярам типа списка из нескольких потоков без блокировки. Но вы ДОЛЖНЫ заблокировать доступ к тому же экземпляру списка.

Посмотрите на это для получения дополнительной информации: Thread Safty в SGI STL

1 голос
/ 05 февраля 2009

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

1 голос
/ 05 февраля 2009

Поскольку операции stl pop / push не являются атомарными, вы должны использовать мьютекс.

1 голос
/ 05 февраля 2009

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

Однако в стандарте C ++ не указывается, должны ли эти операции быть поточно-ориентированными, поэтому решение об этом принимает индивидуальная реализация. Проверьте документы. (Или дайте нам знать, какую реализацию вы используете)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...