const は C 11 のスレッド セーフを意味しますか?
const が C 11 のスレッド セーフを示すという概念は、部分的には真実です。 C 標準によれば、同じメモリ位置を変更またはアクセスするだけの式は競合しているとみなされます。データ競合は、異なるスレッド内に 2 つの競合するアクションがあり、少なくとも 1 つがアトミックでなく、どちらも他方より先に発生しない場合に発生します。
標準ライブラリでは、const オブジェクトに対する操作がスレッドセーフであることを期待しています。これは、ユーザー定義型の const オブジェクトに対する操作が行われる限り、標準ライブラリではデータ競合が発生しないことを意味します。
この期待に違反すると、標準ライブラリ コンポーネントと直接的または間接的に対話する型のデータ競合が発生する可能性があります。基本的に、const は標準ライブラリの観点からはスレッドの安全性を暗示しますが、コンパイラが強制しない契約のままです。
Const と Java の同期
Const in C 11 は Java の同期に相当しません。 set_size メソッドと area メソッドを備えた単純化された長方形クラスを考えてみましょう。 area がスレッドセーフであるのは、const によるものではなく、その読み取り専用の性質によるものです。ただし、set_size を area と同時に呼び出すと、データ競合が発生する可能性があります。
rect クラスのスレッドの安全性を確保するには、const だけでは不十分です。データ競合を防ぐために、書き込みはミューテックスなどを使用して内部で同期する必要があります。
スレッド セーフへの影響
コストがかかることを避けるために、その領域をキャッシュする Rect クラスを検討してください。計算:
class rect { mutable int cached_area = 0; mutable bool cached_area_valid = true; // ... };
エリア メソッドは、実行されるため、スレッドセーフではなくなりました。と書いています。標準コンテナーに rect インスタンスを含めることは、読み取り動作を期待する標準ライブラリとの契約を意味します。書き込みの実行中にこのコントラクトを維持するには、ミューテックスとの内部同期が必要です。
class rect { mutable std::mutex cache_mutex; // ... };
結論
Const は、限定的な意味ではスレッドの安全性を伝えますが、実際には、それを保証するものではありません。真のスレッドセーフを実現するには、特に標準ライブラリと対話するユーザー定義型の場合、追加の同期メカニズムが必要になる場合があります。
以上がC 11 では、「const」はスレッドの安全性を保証しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。