グローバル変数を読み取るスレッドが 2 つある場合、mutex を使用してグローバル変数をロックおよびロック解除する必要がありますか?
4 に答える
一般に、一貫性のない状態が表示されないようにするには、排他アクセスが必要です。リーダー スレッドの場合、これは部分的な読み取りを回避することを意味します。
どういう意味ですか ?座標など、2 つの (原子) 整数に値が格納されているとします。
int i = 3;
int j = 4;
より正確には、スレッドが からへ斜めに移動しi
たい場合:j
Writer
(3, 4)
(4, 5)
Reader Writer
| |
| i = 4
| |
i = 4 <pause>
j = 4 |
| j = 5
| |
これは部分読み取りと呼ばれます。Reader
スレッドは、オブジェクトがそこになかった(4, 4)
にもかかわらず、オブジェクトがあるという情報を取得しました。これらの座標を使用して平面の軌道を計算するとどうなるか考えてみましょう...
ただし、部分読み取りを回避するのはかなり簡単です。ミューテーションはアトミックに確認する必要があります。
- (読み取りの期間中)突然変異がない場合は、単に読み取ることができます
- ミューテーションがある場合は、相互排除メカニズム (リーダー/ライター ミューテックスなど) が必要です。
したがって、あなたの質問に答えるために、アクセスが読み取りアクセスのみの場合、同期は必要ありません。ただし、読み取った情報をときどき (まれにでも) 変更する場合は、なんらかのメカニズムが必要です。
彼らがただ読んでいるだけなら、ロックする必要はありません。
読み取りだけの場合はロックの必要はありませんが、そうでない場合は、ミューテックスにより、読み取りスレッドが何もしていないときにリソースを消費しないことが保証されると思います。
このようなもの:-
Thread1() {
Mutex_lock();
Process global_variable;
Unlock_mutex();
}
同様にThread2
補足:-
Mutex は通常、複数のスレッドが共有メモリやその他のリソースに同時にアクセスするのを防ぐために使用されます。また、それ自体は何もロックしないことを覚えておいてください