2012-02-27 3 views
0

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

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

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

+1

C или C++? C в тегах, C++ в заголовке. – vulkanino

+0

Любая конкретная архитектура или ISA? – Necrolis

ответ

4

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

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

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

4

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

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

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

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

+1

LihO имеет право; вы хотите хорошо разбираться в проблеме читателей-писателей, прежде чем решать ее, поскольку параллелизм является благодатной почвой для ошибок. – zmccord

Смежные вопросы