ホームページ > バックエンド開発 > C++ > なぜ「ロック(これ)がマルチスレッドプログラミングで危険なのですか?

なぜ「ロック(これ)がマルチスレッドプログラミングで危険なのですか?

Patricia Arquette
リリース: 2025-01-31 06:26:09
オリジナル
999 人が閲覧しました

Why is `lock(this)` Dangerous in Multithreaded Programming?

マルチスレッドプログラミングでの隠された危険の使用を避けてくださいマイクロソフト文書は、自由にの使用を避け、その背後にある理由と潜在的な結果を理解するために明確に推奨されています。 lock(this) 制御されていないロックの問題

lock(this)問題の中核は、他のスレッドが同じオブジェクトをロックする可能性があることを制御することが不可能であることです。これにより、死んだロックが簡単になります。

オブジェクトが公開されていると仮定し、誰でもその参照を取得できると仮定します。これらの参照のいずれかがオブジェクトのロックに使用された場合、オブジェクトの作成者はそれについて何も知らない場合があります。これは並列実行を複雑にし、事故エラーを引き起こす可能性があります。 カプセル化を破壊し、明確さを減らす 違法な包装原理を使用して、ロックメカニズムはパブリックアクセスにさらされます。これにより、オブジェクトの予想される使用と動作を理解することが困難になります。それどころか、プライベートフィールドでのロックは、注意点のより明確な分離を提供し、不必要な実装の詳細にさらされることなく内部でロックすることを保証できます。

誤解と文字列の危険

いくつかの誤解が不注意にの使用に貢献しています。誤解の1つは、ロックオブジェクト自体が、オブジェクトの変化性や変更を避けるために非常に方法であることです。そうではありません。 ステートメントに渡されたパラメーターオブジェクトは、ロックオブジェクトを識別するキーを識別することのみです。

別のトラップは、文字列をlock(this)ステートメントのキーとして使用しようとすることです。文字列は変更されておらず、アプリケーション間で共有されているため、このアプローチは予期しないロック競合につながる可能性があります。代わりに、プライベートオブジェクトをキーとして使用して、ロックメカニズムをより適切に制御することをお勧めします。

ケーススタディ:並行治療におけるスレッドセキュリティ

潜在的な問題を説明するために、次のC#コードを検討してください:

lock(this) lockメインメソッドでは、複数のスレッドを作成し、各スレッドは

オブジェクトで操作を実行しようとします。オブジェクトを取得するというオブジェクトのロックを使用しようとする

メソッド。ただし、およびメソッドは、オブジェクトを直接的または間接的にロックし、lockをキーとして使用しようとします。これは、コードが別のスレッドのオブジェクトをロックするときに操作を実行しようとするため、予期しないロック競合とデッドロックにつながります。 (TimeWarpおよびNameChaangeメソッドもロックを使用して、これまたはPerson.Nameを使用してロックオブジェクトとして使用していると想定されています。元のテキストは完全なコードを提供しませんでした)

要するに、

を使用して、スレッドセキュリティを破壊し、潜在的なデッドロックを作成します。プライベートフィールドパッケージングロックメカニズムを使用し、ステートメントのキーとしてプライベートオブジェクトを使用すると、より堅牢で信頼性の高いスレッド同期方法を提供できます。

以上がなぜ「ロック(これ)がマルチスレッドプログラミングで危険なのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート