GCC STL поточно-ориентированный? - PullRequest
5 голосов
/ 07 сентября 2011

Я нашел противоречивую информацию в Интернете: http://www.sgi.com/tech/stl/thread_safety.html

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

http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_concurrency.html

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

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

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

Ответы [ 4 ]

4 голосов
/ 07 сентября 2011

Как я понимаю:

оба документа говорят одно и то же по-разному.Реализация MS STL (на самом деле Dinkumware) говорит почти так же, как и ваш цитируемый документ SGI.Они означают, что они не сделали ничего, чтобы сделать объекты STL (например, контейнеры) потокобезопасными, скорее всего потому, что это добавило бы ненужные накладные расходы во многих однопоточных приложениях.Любой объект является потокобезопасным в их терминах, вы можете прочитать его из нескольких потоков.

Также документы гарантируют, что объекты STL не будут изменены под капотом в некоторых фоновых потоках.

2 голосов
/ 17 октября 2012

FWIW Я недавно обновил документацию по libstdc ++, теперь она говорит (выделено мое):

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

2 голосов
/ 07 сентября 2011

Информация, которую вы цитируете, не является противоречивой. Библиотеки STL должны быть безопасными для использования в многопоточной среде (на самом деле, я работал с одной реализацией, где это было не так), но бремя пользователей синхронизировать доступ к объектам библиотеки - это бремя. Например, если вы создаете набор целых чисел в одном потоке и другой набор целых чисел в другом потоке и не разделяете ни одно из них между потоками, вы должны иметь возможность использовать их; если вы разделяете экземпляр набора между потоками, то вам нужно синхронизировать доступ к набору.

0 голосов
/ 08 сентября 2011

STL больше нет.Он заменен стандартной библиотекой C ++.Если вы используете ISO C ++ и Стандартную библиотеку, вам следует прочитать (a) Стандарт и (b) документацию, прилагаемую к вашей реализации C ++.

Документация SGI STL в основном представляет исторический интерес, если только вы по какой-то причине не используете SGI STL.

...