Общая память C ++ Чтение и запись синхронизации - PullRequest
0 голосов
/ 27 февраля 2012

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

У меня есть две программы, одна получит некоторые данные с серверов и Интернета и сохранит проанализированные данные в общей памяти, и у меня есть программа чтения, которая будет считывать до последнего сохраненного набора данных.

Например, если первая программа собрала данные со 100 серверов и в настоящее время находится на 101-м сервере, программа чтения будет считывать все данные до 100-го сервера. Как только 101-й закончен, программа чтения прочитает 101-й набор данных. Здесь набор данных с сервера может иметь несколько данных, таких как дисковое пространство, загрузка и т. Д. Так повреждает ли этот вид доступа данные в общей памяти? Или это нормально, как я это делаю?

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

То, что вы описали, на самом деле является распространенной вычислительной проблемой в параллелизме, которая называется Читатели-пишущие

Если вы пытаетесь читать из памяти, пока другая программа пишетк нему вы, скорее всего, получите поврежденные данные.Вам следует использовать один из примитивов синхронизации (блокировки, семафоры, мониторы ...), чтобы такая ситуация никогда не возникала.

Я рекомендую вам взглянуть на Маленькая книга семафоров , особенно глава 4.2 Проблема читателей-писателей .

4 голосов
/ 27 февраля 2012

Есть ли причина, по которой вы делаете это с процессами, а не с потоками? Это может усложнить вашу жизнь с точки зрения синхронизации.

Если бы вы работали с потоками, я бы сказал вам, чтобы защитить ваш доступ с помощью семафора, чтобы вы могли гарантировать, что читатель не читает тот же набор данных, который пишет писатель; Я считаю, что реализации семафоров и других примитивов синхронизации существуют и для разделяемой памяти между процессами, но это немного реже.

Причина, по которой вам определенно следует использовать чужие примитивы синхронизации, заключается в том, что на современном оборудовании записи могут быть переупорядочены или отложены, например, первая программа «в данный момент находится на 101-м сервере», но на самом деле записи в данные для 100-го сервера еще не записаны обратно из ЦП. Семафор или мьютекс будут включать соответствующие инструкции по выделению памяти для сброса записей, чтобы память выглядела согласованной с другими потоками / процессами; Вы должны абсолютно точно использовать чужую тщательно написанную реализацию, а не писать собственную логику синхронизации.

Кроме того, при тестировании очень важно проводить тестирование на многопроцессорной машине, поскольку условия состязания между процессами гораздо реже появляются на однопроцессорной машине.

...