#include <mutex> int a; char c; std::mutex t; int main() { std::lock_guard<std::mutex> zz(t); a = 2; c = '1'; return 0; }
如上面这小段代码,请问c++11中的mutex,是不是只要mutex被锁住了,就是默认对所有的共享数据加上了锁?
认证0级讲师
ロックのスコープはロックのスコープ に依存するため、テスト プログラムではメイン スコープがロックされます。 もちろん、マルチスレッドで使用されないため、サンプルプログラム自体は意味がありません。現時点では、ミューテックスをロックしようとすると、他のスレッドはミューテックス ロックが解放されるまで待つ必要があるとします。これは、ある時点で 1 つのスレッドだけが変数 a と c にアクセスできることを意味します。
ロック後、現在のスレッドがロックを解放しない限り、ミューテックス ロックは保持されます。現在のスレッドがロックを取得したとき、コードはすでにこの行を実行し、次の実行行に入っているため、ミューテックスを解放する資格が与えられます。ロック。 。ロックを待機している他のスレッドは、オペレーティング システムによって待機キューからウェイクアップされるまで、ロックが解放される前にこのコード行でスリープ状態になります。
ミューテックス ロックはリソース アクセスを制御します。クリティカル セクションに入るには、ロックを取得する必要があります。この時点で、スレッドにはリソースを消費する、つまり共有データを変更する権限があります。クリティカル セクションを終了するには、ロックを解放し、実行を続行するには他のスレッドにロックを解放する必要があります。
簡単に言えば、いいえ。 Mutex はロックの一種で、1 つのスレッドが同時にロックできることを保証するだけですが、グローバル変数の制御方法は独自のコードによって実装されます。つまり、別のスレッドが最初にミューテックスをロックしようとせず、それらのグローバル変数を直接変更する場合、ブロックされないという合意です。
ロックのスコープはロックのスコープ に依存するため、テスト プログラムではメイン スコープがロックされます。
もちろん、マルチスレッドで使用されないため、サンプルプログラム自体は意味がありません。現時点では、ミューテックスをロックしようとすると、他のスレッドはミューテックス ロックが解放されるまで待つ必要があるとします。これは、ある時点で 1 つのスレッドだけが変数 a と c にアクセスできることを意味します。
ロック後、現在のスレッドがロックを解放しない限り、ミューテックス ロックは保持されます。現在のスレッドがロックを取得したとき、コードはすでにこの行を実行し、次の実行行に入っているため、ミューテックスを解放する資格が与えられます。ロック。 。ロックを待機している他のスレッドは、オペレーティング システムによって待機キューからウェイクアップされるまで、ロックが解放される前にこのコード行でスリープ状態になります。
ミューテックス ロックはリソース アクセスを制御します。クリティカル セクションに入るには、ロックを取得する必要があります。この時点で、スレッドにはリソースを消費する、つまり共有データを変更する権限があります。クリティカル セクションを終了するには、ロックを解放し、実行を続行するには他のスレッドにロックを解放する必要があります。
簡単に言えば、いいえ。 Mutex はロックの一種で、1 つのスレッドが同時にロックできることを保証するだけですが、グローバル変数の制御方法は独自のコードによって実装されます。つまり、別のスレッドが最初にミューテックスをロックしようとせず、それらのグローバル変数を直接変更する場合、ブロックされないという合意です。