Полезны ли заблокированные * функции в общей памяти?
-
08-07-2019 - |
Вопрос
Два процесса Windows сопоставили в памяти один и тот же общий файл.Если файл состоит из счетчиков, уместно ли использовать Interlocked*
функции (например InterlockedIncrement
) чтобы обновить эти счетчики?Будут ли они синхронизировать доступ между процессами?Или мне нужно использовать что-то более тяжелое, например мьютекс?Или, возможно, сам механизм общей памяти обеспечивает согласованность представлений.
Решение
От MSDN:
...
Взаимосвязанный API
Взаимосвязанные функции обеспечивают простой механизм синхронизации доступ к переменной, которая является общей для нескольких потоков.Они также выполняют операции над переменными атомарным образом.Потоки разных процессов могут использовать эти функции, если переменная находится в общей памяти.
Так что, да, это безопасно при вашем подходе с общей памятью.
Другие советы
Взаимосвязанные функции предназначены именно для этого типа использования.
От http://msdn.microsoft.com/en-us/library/ms684122.aspx:
Потоки разных процессов могут использовать эти функции, если переменная находится в общей памяти.
Конечно, если вам нужно обновить более одного элемента атомарно, вам нужно будет использовать мьютекс или какой-либо другой объект синхронизации, который работает в разных процессах.В механизм общей памяти нет ничего встроенного для обеспечения синхронизации доступа к общей памяти - вам нужно будет использовать взаимосвязанные функции или объект синхронизации.