Является ли реестр Win32 потокобезопасным? - PullRequest
17 голосов
/ 01 апреля 2009

Если у меня есть два процесса, обращающихся к данному ключу реестра (например, HKLM), я должен обернуть логику в мьютекс?

Ответы [ 5 ]

21 голосов
/ 01 апреля 2009

В реестре все действия будут атомарными, поэтому вам не нужно синхронизировать их самостоятельно.

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

Редактировать: Дополнительные сведения см. Невозможность заблокировать кого-либо из реестра - это функция, а не ошибка .

4 голосов
/ 01 апреля 2009

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

К сожалению, прямой управляемой поддержки нет, поэтому вам нужно создать оболочки. http://community.bartdesmet.net/blogs/bart/archive/2006/12/14/Windows-Vista-2D00-Introducing-TxR-in-C_2300_-_2800_Part-1_2900_.aspx показывает, как выполнять P / Invoke этих методов.

2 голосов
/ 01 апреля 2009

Windows Server 2008 также поддерживает транзакционный доступ к реестру. Вот обзор на MSDN. А вот сообщение в блоге с объявлением о некоторых вопросах и ответах.

1 голос
/ 01 апреля 2009

Быстро прочитайте эту статью Раймонда Чена. Это объясняет, что отдельные записи и чтения против реестра являются атомарными. Тем не менее, другие блокировки остаются за вами, так как теперь есть способ держать ключ открытым.

http://blogs.msdn.com/oldnewthing/archive/2009/03/26/9508968.aspx

0 голосов
/ 01 апреля 2009

Это зависит от того, что вы общаетесь, и насколько важна информация по времени. Скажем, например, что у вас есть приложение, которое выполняет работу и записывает результаты состояния в раздел реестра, а другое приложение считывает это состояние и отображает его на экране. В этом случае я бы не стал беспокоиться о мьютексе, поскольку читатель всегда получит значение, которое «имеет смысл». То, что вы спрашиваете, на самом деле является фундаментальным вопросом проектирования параллелизма, я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...