Полезны ли функции Interlocked * для совместной памяти? - PullRequest
9 голосов
/ 28 октября 2009

В двух процессах Windows память отображена в один и тот же общий файл. Если файл состоит из счетчиков, целесообразно ли использовать функции Interlocked* (например, InterlockedIncrement) для обновления этих счетчиков? Будут ли они синхронизировать доступ между процессами? Или мне нужно использовать что-то более тяжелое, например мьютекс? Или, возможно, сам механизм разделяемой памяти обеспечивает согласованные представления.

Ответы [ 2 ]

7 голосов
/ 28 октября 2009

Блокированные функции предназначены именно для этого типа использования.

С http://msdn.microsoft.com/en-us/library/ms684122.aspx:

Потоки разных процессов могут использовать эти функции, если переменная находится в общей памяти.

Конечно, если вам нужно атомарно обновить более одного элемента, вам нужно использовать мьютекс или какой-либо другой объект синхронизации, который работает в разных процессах. В механизм разделяемой памяти не встроено ничего, что обеспечивало бы синхронизацию для доступа к разделяемой памяти - вам нужно использовать заблокированные функции или объект синхронизации.

3 голосов
/ 28 октября 2009

С MSDN :

...

Интерфейс API с блокировкой

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

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

...