HKLMの外にある特定のレジストリキーに2つのプロセスがアクセスしている場合、そのロジックをMutexにラップするのは良い考えですか?Win32レジストリは「スレッドセーフですか?
答えて
レジストリは、アクションがアトミックであることを確認するので、自分で同期する必要はありません。
ただし、レジストリに同時にアクセスするプロセス/スレッドが複数ある場合、どのプロセスが先に実行されるかは保証されません。あなただけがデータが文字化けすることはありません。
編集:詳細はThe inability to lock someone out of the registry is a feature, not a bugを参照してください。
これは、コミュニケーションしているものと、その情報がどのようにタイムクリティカルであるかによって異なります。たとえば、仕事をしてステータスの結果をレジストリキーに書き込むアプリケーションと、そのステータスを読み込んで画面に表示する別のアプリケーションがあるとします。その場合、読者は常に「合理的」な価値を得るので、私はミューテックスを気にしません。あなたが求めているのは、並行性設計の基本的な問題です。
このRaymond Chenの記事を素早く読んでください。これは、レジストリに対する個々の書き込みと読み取りがアトミックであることを説明しています。しかし、他のロックはあなたに任されています。今ではキーを独占的に開いておく方法があるからです。
http://blogs.msdn.com/oldnewthing/archive/2009/03/26/9508968.aspx
Windows Server 2008には、レジストリへのトランザクションアクセスをサポートしています。 Here's the overview(MSDN)そして、ここにはblog postがあり、いくつかの質問と回答があります。
他にも言及したように、個々の操作はアトミックです。大規模な操作を不可分にする必要があり、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する方法を示しています。
- 1. Win32ウィンドウはスレッドセーフですか?
- 2. LoadLibrary、FreeLibrary、およびGetModuleHandle Win32関数はスレッドセーフですか?
- 3. プログラムで.regファイルをwin32レジストリにマージする
- 4. strcmpではスレッドセーフですか?
- 5. はPythonスレッドセーフで+ =ですか?
- 6. .NETモジュールはスレッドセーフですか?
- 7. itertoolsはスレッドセーフですか?
- 8. はjava.util.UUIDスレッドセーフですか?
- 9. Azure TopicClientはスレッドセーフですか?
- 10. Troveライブラリはスレッドセーフですか?
- 11. DWScriptはスレッドセーフですか?
- 12. Datastax - PreparedStatementはスレッドセーフですか?
- 13. guava-libraries:Iterators.cycle()はスレッドセーフですか?
- 14. ValueExpressionはスレッドセーフですか?
- 15. DocumentBuilder.parse()はスレッドセーフですか?
- 16. Java:ServerSocket.acceptはスレッドセーフですか?
- 17. SmtpClient.SendMailAsyncメソッドはスレッドセーフですか?
- 18. NSIndexPathはスレッドセーフですか?
- 19. epollはスレッドセーフですか?
- 20. ステートレスセッションはスレッドセーフですか?
- 21. は、スレッドセーフなjavax.sql.DataSourceですか?
- 22. putStrLnはスレッドセーフですか?
- 23. MongoDBはスレッドセーフですか?
- 24. ジェネレータはスレッドセーフですか?
- 25. PHPはスレッドセーフですか?
- 26. botoライブラリはスレッドセーフですか?
- 27. Poco :: Loggerはスレッドセーフですか?
- 28. log4jはスレッドセーフですか?
- 29. Netty Channel.writeはスレッドセーフですか?
- 30. libSoXはスレッドセーフですか?