私はC++でマルチスレッドを学習しており、ミューテックスを発見しました。私のコードは以下の通りです:C++予期しないマルチスレッドの動作
#include "stdafx.h"
#include <thread>
#include <iostream>
#include <string>
#include <mutex>
using namespace std;
std::mutex mu;
void shared_print(string msg, int i) {
std::lock_guard<std::mutex> guard(mu);
cout << msg << i << endl;
}
void function_1() {
for (int i = 0; i > -3; i--)
shared_print("Thread1: ", i);
}
int main() {
std::thread thread1(function_1);
for (int i = 0; i < 3; i++)
shared_print("Main: ", i);
thread1.join();
return 0;
}
私の理解から、ミューテックスは、一度に単一のリソースへのアクセスを許可します。したがって、mutexはそれを呼び出す最初のスレッド(Thread1
)によってロックされます。 main
スレッドがmutexへのアクセスを試みると、mutexのロックが解除されてからThread1
までブロックされます。 main
が実行されると、ブロックされます。cout
が実行されます。
私は結果がなど
Thread1, Main, Thread1, Main
として呼び出しをインターリーブすることを期待しかし、代わりに私は標準出力に以下の結果が得られます。パターンは繰り返しの任意の数の同じまま:
Thread1: 0
Thread1: -1
Thread1: -2
Main: 0
Main: 1
Main: 2
なぜインターリーブするのですか?あなたのコードによって実施される注文はありません。スレッドにCPU時間がまだ残っている場合は、直前に解放したロックを取得できます。 – Arash