我正在编写一个应用程序,该应用程序需要按特定顺序在注册表项内写入注册表值,而其他应用程序可以同时写入同一密钥。
有没有办法暂时锁定注册表项进行写入,以避免多个进程同时写入此注册表项,并且值被弄乱/乱序?
例如,我需要写信给已经包含以下值的HKCUSoftwareCompanyProduct
:
Start1
="abc"
Start2
="def"
Start3
="ghi"
因为最后一个是Start3
,我需要创建Start4
。
问题是,如果另一个进程同时运行,检测到Start3
是最后一个进程,并覆盖我刚刚创建的Start4
(因为它由于并发性而没有看到它)。
防止这种情况发生的好方法是什么?
我无法控制哪些(或多少)应用程序正在写入此密钥,因此我无法告诉它们暂停或类似的事情......
我正在寻找类似于以下伪代码的东西:
Registry.Lock("HKCUSoftwareCompanyProduct");
Registry.Write("Start4", "jkl");
Registry.Unlock("HKCUSoftwareCompanyProduct");
不幸的是,我似乎要回答我自己的问题。
写入和删除注册表数据
在写入操作期间无法锁定注册表项以同步对数据的访问。但是,您可以控制对 使用安全属性的注册表项。有关详细信息,请参阅 注册表项安全性和访问权限。
可以在单个注册表操作中执行多个注册表操作 交易。若要将注册表项与事务关联,请 应用程序可以使用 RegCreateKeyTransactact 或 RegOpenKeyTransact 功能。有关事务的详细信息,请参阅内核事务管理器。
寄件人: https://learn.microsoft.com/en-us/windows/win32/sysinfo/writing-and-deleting-registry-data
您必须使用互斥函数使用正确的同步。与大多数Windows API一样,注册表API不是线程安全的。