検索

ホームページ  >  に質問  >  本文

linux - 多线程编程中的mutex

#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被锁住了,就是默认对所有的共享数据加上了锁?

PHP中文网PHP中文网2838日前881

全員に返信(3)返信します

  • 巴扎黑

    巴扎黑2017-04-17 16:30:49

    ロックのスコープはロックのスコープ に依存するため、テスト プログラムではメイン スコープがロックされます。
    もちろん、マルチスレッドで使用されないため、サンプルプログラム自体は意味がありません。現時点では、ミューテックスをロックしようとすると、他のスレッドはミューテックス ロックが解放されるまで待つ必要があるとします。これは、ある時点で 1 つのスレッドだけが変数 a と c にアクセスできることを意味します。

    返事
    0
  • PHPz

    PHPz2017-04-17 16:30:49

    ロック後、現在のスレッドがロックを解放しない限り、ミューテックス ロックは保持されます。現在のスレッドがロックを取得したとき、コードはすでにこの行を実行し、次の実行行に入っているため、ミューテックスを解放する資格が与えられます。ロック。 。ロックを待機している他のスレッドは、オペレーティング システムによって待機キューからウェイクアップされるまで、ロックが解放される前にこのコード行でスリープ状態になります。

    ミューテックス ロックはリソース アクセスを制御します。クリティカル セクションに入るには、ロックを取得する必要があります。この時点で、スレッドにはリソースを消費する、つまり共有データを変更する権限があります。クリティカル セクションを終了するには、ロックを解放し、実行を続行するには他のスレッドにロックを解放する必要があります。

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-17 16:30:49

    簡単に言えば、いいえ。 Mutex はロックの一種で、1 つのスレッドが同時にロックできることを保証するだけですが、グローバル変数の制御方法は独自のコードによって実装されます。つまり、別のスレッドが最初にミューテックスをロックしようとせず、それらのグローバル変数を直接変更する場合、ブロックされないという合意です。

    返事
    0
  • キャンセル返事