Как узнать, какие общие переменные мне нужно защитить с помощью блокировки в c ++ с помощью boost? - PullRequest
2 голосов
/ 18 октября 2010

Например, многопоточность никогда не будет работать, если мьютексы не будут устойчивы к многопоточному доступу (например, два одновременных вызова mutex.lock () не могут испортить ситуацию).

Это распространяется и на условные переменные? В частности, я хочу снять блокировку и затем вызвать cond.notify_one (). Теоретически, другой поток может захватить блокировку до уведомления и начать собственный вызов cond.notify_one (). Есть ли гарантия, что это будет хорошо себя вести?

А как насчет простых структур данных, размещенных в куче? Можно ли разрешить одновременный доступ, если структура данных только читается, при условии, что структура данных гарантированно не будет саморегулироваться при чтении? Есть ли документация, по которой структуры данных stl и функции-члены допускают одновременное чтение без блокировки?

Ответы [ 4 ]

6 голосов
/ 18 октября 2010

Вам необходимо синхронизировать доступ к любому объекту, где

  1. объект используется более чем одним потоком, а
  2. хотя бы один из этих потоков может изменить объект.

Существуют различные способы сделать эту синхронизацию: блокировки (мьютексы) и атомарность, вероятно, являются двумя наиболее часто используемыми, хотя существуют реализации без блокировки некоторых структур данных.

Есть ли документация, в которой структуры данных STL и функции-члены допускают одновременное чтение без необходимости блокировки?

Любая из квалифицированных в const функций-членов должна быть безопасна для вызова.

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

2 голосов
/ 18 октября 2010

Можно ли разрешить параллельный доступ, если структура данных только читается

Да.Доступ только для чтения может никогда создавать конфликты многопоточности.

1 голос
/ 18 октября 2010

Мьютексы и условные переменные являются частью «многопоточной цепочки инструментов», используемой для реализации многопоточных приложений. Как таковые, они по определению являются «потокобезопасными».

В частности, я хочу снять блокировку и затем вызвать cond.notify_one (). Теоретически, другой поток может захватить блокировку до уведомления и начать собственный вызов cond.notify_one (). Есть ли гарантия, что это будет хорошо себя вести?

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

А как насчет простых структур данных, размещенных в куче?

Simple (как в байтовых буферах или структурах в стиле C) может быть безопасно доступен одновременно. Любые мутирующие объекты требуют синхронизации.

Имеется ли документация о том, какие структуры данных stl и функции-члены допускают одновременное чтение без необходимости блокировки?

Насколько мне известно, стандартные библиотечные пакеты C ++, как правило, не являются потокобезопасными.

0 голосов
/ 18 октября 2010

Теоретически, другой поток может захватить блокировку перед уведомлением и начать собственный вызов cond.notify_one (). Есть ли гарантия, что это будет хорошо себя вести?

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

Это типичный шаблон использования: Условия повышения

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