Вы используете термин atomi c не совсем правильно, но я думаю, вопрос больше в том, будут ли два фрагмента кода вести себя одинаково.
Если myFoo
- это только вызывается между блокировкой / разблокировкой, ответ - да, они одинаковые.
Однако во втором случае вы потеряли защиту myFoo
. Другой поток может вызвать myFoo
без предварительного вызова блокировки, что может вызвать проблемы.
Итак, второй пример плохой, так как он открывает больше ошибок. Придерживайтесь первого, т.е. сохраняйте блокировку / разблокировку внутри функции .
Также обратите внимание:
Поскольку myGlobal
является глобальной переменной, вы не можете быть уверены, что потоки не обращаются к нему напрямую. Есть несколько способов избежать этого. В приведенном ниже примере показана одна функция с переменной stati c. С помощью этой функции можно получить переменную stati c и, при желании, сделать приращение.
int myFoo(int doIncrement)
{
static int myStatic = 0;
int result;
pthread_mutex_lock(&mutex);
if (doIncrement) myStatic++;
result = myStatic;
pthread_mutex_unlock(&mutex);
return result;
}
Теперь переменная myStatic
скрыта от всех потоков и доступна только через myFoo
.
int x = myFoo(1); // Increment and read
int y = myFoo(0); // Read only