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