Herb Sutter ( http://isocpp.org/blog/2012/12/you-dont-know-const-and-mutable-herb-sutter ) によると、C++11 では、const メソッドはオブジェクトのビットを変更してはなりません。または、変更可能なデータメンバーがある場合は、内部同期を実行する必要があります (例: ミューテックスを使用)。
複数のスレッドからアクセスしているグローバル オブジェクトがあり、そのオブジェクトに変更可能なメンバーがあるとします。議論のために、クラスのソースを変更できないと仮定しましょう (サードパーティによって提供されます)。
C++98 では、これらのスレッドはグローバル ミューテックスを使用して、このオブジェクトへのアクセスを同期します。したがって、アクセスには単一のミューテックス ロック/ロック解除が必要です。
ただし、C++11 では、このオブジェクトに対する const メンバー関数呼び出しも内部同期を呼び出すため、このオブジェクトに対する 1 回の const 関数呼び出しで 2 回のロック/ロック解除操作が必要になる可能性があります (関数の数によってはそれ以上)。単一のスレッドから呼び出します)。const はライターに対して何もしないように見えるため、グローバルミューテックスがまだ必要であることに注意してください (const 以外のメソッドの 1 つが const メソッドを呼び出した場合にライターを遅くする可能性を除いて)。
それで、私の質問は次のとおりです。すべてのクラスを C++ でこのようにする必要がある場合 (少なくとも STL で使用できるようにするため)、これは過度の同期手段につながりませんか?
ありがとう
編集:いくつかの説明:
C++11では、constメンバー関数が内部的に同期されていない限り(または書き込みを実行していない場合)、標準ライブラリでクラスを使用できないようです。
C++11 は同期コード自体を自動的に追加しませんが、標準ライブラリに準拠したクラスは、C++98 では同期を必要としませんが、C++11 では同期が必要です。したがって、C++98 では可変メンバーの内部同期を行わなくても問題は解決できますが、C++11 ではできません。