私は同時実行に不慣れで、に疑問を持っていstd::mutex
ます。私が int a; を持っているとしましょう。そして、本は私にmutex amutを宣言するように言っています。a を介した排他的アクセスを取得します。ここで私の質問は、ミューテックス オブジェクトがどの重要なリソースを保護する必要があるかをどのように認識しているのかということです。つまり、どの変数ですか?2 つの変数 int a,b; があるとします。今、私はmutex abmutを宣言します。今abmutは何を保護しますか??? aとbの両方、またはaまたはbのみ???
6 に答える
あなたの疑問は正当化されます。そうではありません。a
ミューテックスを持っている場合にのみアクセスできるようにするのは、プログラマーとしてのあなたの仕事です。他の誰かがミューテックスを取得した場合は、アクセスしないでくださいa
。ミューテックスがない場合と同じ問題が発生します。これは、すべてのスレッド同期構造に当てはまります。それらを使用してリソースを保護できます。彼らは自分でそれをしません。
ミューテックスは、リソースへのアクセスを同期するために使用されます。ゲッターとセッターを使用して読み書き操作を行う int というデータがあるとします。したがって、ゲッターとセッターの両方が同じミューテックスを使用して、読み取り/書き込み操作を同期します。
これらの関数は両方とも、最初にミューテックスをロックし、戻る前にロックを解除します。デストラクタで自動的にロックを解除する scoped_lock を使用できます。
void setter(value_type v){
boost::mutex::scoped_lock lock(mutex);
value = v;
}
value_type getter() const{
boost::mutex::scoped_lock lock(mutex);
return value;
}
あなたが友達と一緒にテーブルに座っており、真ん中においしいケーキ (保護したいリソース、たとえば整数 a) があると想像してください。さらに、テニス ボールが 1 つあります (これがミューテックスです)。現在、ボールを持てるのは 1 人だけですが (lock_guard または同様のメカニズムを使用してミューテックスをロックします)、全員がケーキを食べることができます (整数 a にアクセスします)。
グループとして、ボールを持っている人だけがケーキから食べることができるというルールを設定することができます (mutex をロックした人だけが a にアクセスできます)。この人は、ボールをテーブルに置いて (mutex のロックを解除して) 放棄することができるので、別の人がそれをつかむことができます (mutex をロックします)。このようにして、必死にケーキを食べている間、誰もフォークで他の人を刺さないようにします.
最後の段落で説明したようなルールを設定して維持するのは、プログラマーとしてのあなたの仕事です。ミューテックスとリソース (整数 a など) の間に固有の接続はありません。