Блокировка при доступе к общей памяти для чтения

Если я получаю доступ к общей памяти только для чтения, чтобы проверить условие для блока if() , должен ли я блокировать мьютекс? Например

 mutex_lock(); if (var /* shared memory */) { } mutex_unlock(); 

Необходима ли блокировка и хорошая практика?

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

Вы можете читать только атомарно, если ваш компилятор предоставляет вам необходимые примитивы; это могут быть либо атомарные функции, которые поставляются с C11 и C ++ 11, либо некоторые другие языковые расширения, предоставляемые вашим компилятором. Затем вы можете перенести захват мьютекса в условное, но если вы подождете, пока после теста на получение мьютекса, кто-то другой может изменить его между временем его проверки и временем, когда вы приобретете мьютекс:

 if (example) { // "example" variable could be changed here by another thread. mutex_lock(); // Now the condition might be false! mutex_unlock(); } 

Поэтому я предлагаю приобрести мьютекс до условного, если профилирование не выявило бы наличие мьютекса в качестве узкого места. (И в том случае, если тестируемая переменная больше, чем регистр ЦП, например, 64-разрядное число на 32-битном ЦП, то у вас даже нет возможности отложить получение мьютекса без какого-либо другого вида атомной выборки или сравнения примитива.)