Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式锁定注册表项以避免并发问题_C#_C++_Winapi - Fatal编程技术网

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

C# 以编程方式锁定注册表项以避免并发问题,c#,c++,winapi,C#,C++,Winapi,我正在编写一个应用程序,它需要按特定顺序在一个键中写入注册表值,而其他应用程序可以同时写入同一个键 是否有一种方法可以临时锁定注册表项进行写入,以避免多个进程同时写入此注册表项,并避免值混乱/无序 e、 g.我需要写信给HKCU\Software\Company\Product\,其中已经包含以下值: Start1=“abc” Start2=“def” Start3=“ghi” 因为最后一个是Start3,所以我需要创建Start4 问题是,如果另一个进程同时运行,检测到Start3是最后一

我正在编写一个应用程序,它需要按特定顺序在一个键中写入注册表值,而其他应用程序可以同时写入同一个键

是否有一种方法可以临时锁定注册表项进行写入,以避免多个进程同时写入此注册表项,并避免值混乱/无序

e、 g.我需要写信给
HKCU\Software\Company\Product\
,其中已经包含以下值:

  • Start1
    =
    “abc”
  • Start2
    =
    “def”
  • Start3
    =
    “ghi”
因为最后一个是
Start3
,所以我需要创建
Start4

问题是,如果另一个进程同时运行,检测到
Start3
是最后一个进程,并覆盖我刚刚创建的
Start4
(因为它由于并发而没有看到它)

防止这种情况发生的好方法是什么?

我无法控制哪些(或有多少)应用程序正在向该键写入数据,因此我无法告诉它们暂停或诸如此类的操作

我正在寻找类似下面的伪代码:

Registry.Lock("HKCU\Software\Company\Product\");
Registry.Write("Start4", "jkl");
Registry.Unlock("HKCU\Software\Company\Product\");

您必须使用正确的同步。注册表API和大多数Windows API一样,不是线程安全的。

很遗憾,我要回答我自己的问题了

在写入操作期间,无法将注册表项锁定到 同步数据访问。但是,您可以控制对数据库的访问 使用安全属性的注册表项。有关详细信息,请参阅

在一个单独的数据库中可以执行多个注册表操作 交易要将注册表项与事务关联,请使用 应用程序可以使用或 功能。有关事务的详细信息,请参阅

发件人:


您可能想查看一下
regopenkeytransaled
这些键的特殊性。一点也不象一个随机程序会跳进来改变一个值那样。因此,也许有一种潜在的缺乏协调的现象,就像这篇老博文一样或者,您实际上想要的是编写程序上的单个实例模式?谢谢@Jim,我查看了
regopenkeytransaled
,但它并没有完全满足我的需要,因为它仍然允许其他进程写入相同的密钥。。。正如上面所说的:当使用此函数打开密钥时,将处理对该密钥的后续操作。如果在提交事务之前对密钥执行了非事务操作,则事务将回滚谢谢@Christopher,我在问题中编写的密钥与我正在编写的密钥不完全相同,这只是一个示例。我确信其他几个应用程序会写入我感兴趣的密钥,而我的应用程序不会创建或拥有该密钥。。。这是在应用程序中安装插件的关键。创建这些值会在拥有密钥的应用程序中注册一个插件。。。应用程序之间不可能进行协调,因为它们彼此不了解。它必须是Windows提供的。事务回滚意味着您将返回一个错误代码,此时您可以检查新状态并重试(例如,您将看到Start4已经存在)。谢谢@Michael。不幸的是,我无法控制哪些(或多少)应用程序正在写入此密钥,因此我无法通过互斥或任何方式与它们合作,因为我们彼此不了解…@Lindsey1986“无法控制哪些(或多少)应用程序正在写入此密钥”--这正是全局命名互斥所解决的问题!你的应用程序只需在互斥体名称上达成一致,而不必了解对方的任何其他信息。他无法控制的应用程序究竟应该如何在互斥体名称上达成一致?@ošħWilliard OP似乎有足够的控制权让他们同意使用事务注册API。如果是这样,他们也可以就互斥体达成一致。@zett42我无法控制其他写入同一密钥的应用程序。。。他们是我不知道、不控制的第三方应用程序,他们也不知道我的应用程序存在。这些应用程序之间不可能有任何形式的合作……回答你自己的问题从来都不是一件坏事。你可以帮助自己,通过发布答案,你在未来帮助了其他人。别忘了自己做标记,这样寻求帮助的人可以很容易地找到他们最想要的。感谢@DrakeWu MSFT的提醒。在我发布答案的时候,我没有足够的声誉将我自己的答案标记为有效答案。。。但现在我知道了