以编程方式锁定注册表项以避免并发问题



我正在编写一个应用程序,该应用程序需要按特定顺序在注册表项内写入注册表值,而其他应用程序可以同时写入同一密钥。

有没有办法暂时锁定注册表项进行写入,以避免多个进程同时写入此注册表项,并且值被弄乱/乱序?

例如,我需要写信给已经包含以下值的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不是线程安全的。

最新更新