У меня есть два процесса: клиент, который потребляет данные, и сервер, который считывает данные с диска, расшифровывает их и делает их доступными для клиента.Они взаимодействуют через разделяемую память, и хотя никогда не возникает конфликт доступа при записи, поскольку они никогда не записывают в одни и те же области памяти, мне пришлось использовать мьютекс, чтобы заставить значения разделяемой памяти быть «актуальными» (согласованными) по отношению к-а-вид их копии в локальном кэше двух процессов.Этот вопрос касается степени (объема) разделяемой памяти, которую мьютекс заставит быть согласованным.
Обычно моя проблема заключается в
Process A changes shared memory variable from value X to value Y, but...
... in fact it only updates its local cache copy immediately.
... the main memory variable will be updated at some later time.
So process B will not "see" that change in shared memory immediately ...
... unless some sort of data synchronisation is enforced
Поэтому я использую общий мьютекс для обеспечения синхронизации.Я вполне понимаю, что если у меня есть два процесса и я выполняю (в псевдокоде) процесс A:
lock_mutex
update [shared variables]
release mutex
, то содержимое [общих переменных] будет согласованным, когда процесс B блокирует мьютекс и проверяет его,потому что последовательность блокировки / разблокировки мьютекса вынуждает выполнять обновление из локально кэшированных значений.
Но хотя документация по мьютексам очень четко описывает исполняемые строки, защищенные между событиями блокировки / освобождения, не так ясно о степенипамяти, которая вынуждена быть последовательной в этом процессе.Он говорит более или менее, что «память в текущей области будет защищена», но не определяет, что такое «текущая область».
Так что насчет этого фрагмента псевдокода (все в пределах одной функции):
update [block of data in shared memory]
lock_mutex
update [a few other shared variables elsewhere in shared memory]
release mutex
Каково состояние согласованности между локальным кешем и разделяемой памятью блока данных [в общем хранилищепамять], когда другой процесс блокирует этот мьютекс?Он входит в сферу действия функции, но не входит в фрагмент кода блокировки / разблокировки мьютекса, поэтому я не знаю, каким будет его статус согласованности.
Извините, если это кажется действительноглупый вопрос, но я не смог получить прямой ответ ни из своих книг, ни из поиска в Интернете.Я знаю, что очевидным решением является «защитить другие данные, используя также мьютекс», но на самом деле он может быть очень большим (потенциально гигабайтным) и его будет довольно сложно достичь, поэтому я бы предпочел этого избежать, если это возможно.
Я должен добавить, что я пишу на простом Ansi C, как на Windows (с использованием собственных API-интерфейсов Win32), так и на Linux (с использованием pthreads), работая на обычном многоядерном оборудовании x86_64.
Заранее спасибо.