Подтвердить что ты не робот

Создает ли std:: mutex забор?

Если я заблокирую std::mutex, я всегда получу забор памяти? Я не уверен, что это подразумевает или принуждает вас к тому, чтобы получить забор.

Update:

Нашел эту ссылку, следуя комментариям RMF.

Многопоточное программирование и видимость памяти

4b9b3361

Ответ 1

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

Ответ 2

Как я понимаю, это описано в:

1.10 Многопоточные исполнения и расписания данных

Параграф 5:

Библиотека определяет ряд атомных операций (статья 29) и операции над мьютексами (статья 30) которые специально идентифицированы как операции синхронизации. Эти операции играют особую роль в назначении назначений в одном потоке, видимом другому. Операция синхронизации в одном или нескольких ячейках памяти представляет собой либо операцию потребления, операцию получения, операцию освобождения, либо операцию получения и освобождения. Операция синхронизации без привязанной ячейки памяти является ограждением и может быть либо заборным ограждением, заборным зазором, либо как заборным, так и освобождающим забором. Кроме того, существуют расслабленные атомные операции, которые не являются операциями синхронизации, и атомарные операции чтения-модификации-записи, которые имеют особые характеристики. [Примечание. Например, вызов, который получает мьютекс, будет выполнять операцию получения в местах, содержащих мьютекс. Соответственно, вызов, который выпускает один и тот же мьютекс, будет выполнять операцию деблокирования в тех же местах. Неформально выполнение операции деблокирования A приводит к тому, что предыдущие побочные эффекты воздействуют на другие ячейки памяти, чтобы стать видимыми для других потоков, которые позже выполняют операцию потребления или получения на A. "Расслабленные" атомарные операции не являются операциями синхронизации, хотя, например, они не могут способствовать расстановке данных. -end note]

Ответ 3

Блокировка и разблокировка мьютексов полезна, только если мьютекс используется разными потоками. Если компилятор знает, что это не так, как если бы мьютекс представлял собой автоматическую переменную, адрес которой не взят (и не является ссылкой на нее), то для операций блокировки/разблокировки не требуется генерировать значимый код.

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

C/C++ семантика потока (*) не допускает никакой замены atomic_thread_fence которая в целом верна: любое преобразование кода, которое удаляет вызов atomic_thread_fence является правильным только в контексте.

(*) "Семантика потока C/C++", а не "Семантика потока языка C/C++": C и C++ основаны на одной и той же спецификации для примитивов синхронизации, что не означает, что существует C/C++ язык)