Я реализовывал простую программу Producer/Consumer, в которой были семафоры и разделяемая память. Для простоты предположим, что в моей программе есть только блок разделяемой памяти и семафор.
Поначалу я думал, что критическим разделом мне нужно считать только фрагменты кода, которые попытаются записать в разделяемый блок памяти. Но поскольку блок разделяемой памяти состоит, скажем, из 1024 байт, я не могу прочитать все данные одновременно (это не атомарная операция), так что действительно возможно, что пока я читаю из него, Producer приходит и начинает писать в нем, так что читатель получит половину старых данных, половину новых данных. Исходя из этого, я могу только подумать, что мне также нужно поместить логику чтения общей памяти в блок «семафор».
Теперь у меня есть много кода, который выглядит так:
if (sharedMemory[0] == '0') { ... }
В этом случае я просто ищу один символ в памяти. Я думаю, мне не нужно беспокоиться об установке семафора вокруг этого, не так ли?
А что, если вместо этого у меня будет что-то вроде
if (sharedMemory[0] == '0' && sharedMemory[1] == '1') { ... }
С моей точки зрения, я предполагаю, что, поскольку это две операции, я должен рассматривать это как критический раздел, поэтому мне нужно поместить вокруг него семафор. Я прав?
Спасибо!