Win32注册表是否是线程安全的?

时间:2009-04-01 16:26:40

标签: multithreading winapi synchronization registry

如果我有两个进程访问给定的注册表项(例如HKLM),我应该将逻辑包装在互斥锁中吗?

5 个答案:

答案 0 :(得分:21)

注册表将确保操作是原子操作,因此您不必自己进行同步。

但是,如果您有多个进程/线程同时访问注册表,则它不会保证首先发生哪些情况。只有你不会得到乱码数据。

编辑:进一步阅读,请参阅The inability to lock someone out of the registry is a feature, not a bug

答案 1 :(得分:4)

正如其他人所提到的,个别行动是原子的。如果您需要更大规模的操作集,并且您的目标是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 :(得分:2)

Windows Server 2008还支持对注册表的事务性访问。 MSDN上的Here's the overview。这是一个blog post,通过一些问题和答案宣布它。

答案 3 :(得分:1)

快速阅读这篇Raymond Chen文章。它解释了针对注册表的个人写入和读取是原子的。但是,其他锁定取决于您,因为现在可以专门打开一个键。

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

答案 4 :(得分:0)

这取决于您正在沟通的内容以及信息的时间关键性。例如,假设您有一个应用程序正在执行工作并将状态结果写入注册表项,另一个应用程序读取该状态并在屏幕上显示它。在这种情况下,我不会打扰互斥量,因为读者总会得到一个“有意义”的值。你想要的是真正的并发设计的基本问题,我认为。