1. ホーム
  2. c++

ミューテックスはミュータブルであるべきなのか?

2023-11-05 14:06:25

質問

これがスタイルの質問なのか、それとも厳格なルールがあるものなのかわかりませんが......。

パブリックメソッドインターフェースをできるだけ const に保ちつつ、オブジェクトをスレッドセーフにしたい場合、mutable mutexes を使用すべきでしょうか?一般的に、これは良いスタイルなのでしょうか、それとも const でないメソッドインターフェイスが好ましいのでしょうか?あなたの考えを正当化してください。

どのように解決するのですか?

[ 回答は編集済みです。 ]

基本的に、ミュータブルなミューテックスでconstメソッドを使用するのは良いアイデアです(ちなみに参照を返してはいけません。ミューテックスは const であるべきではなく、ロック/アンロックメソッドを const として定義するのは恥知らずな嘘でしょう...。

実はこれ(とメモ化)だけが、私が見た限りでは mutable キーワードの唯一の正当な使用法です。

また、オブジェクトの外部にあるミューテックスを使用することもできます。すべてのメソッドがリエントラントになるように手配し、ユーザ自身がロックを管理するようにします。 { lock locker(the_mutex); obj.foo(); } をタイプするのはそれほど難しくありませんし

{
    lock locker(the_mutex);
    obj.foo();
    obj.bar(42);
    ...
}

は、2つのmutexロックを必要としないという利点があります(そして、オブジェクトの状態が変化しなかったことが保証されます)。