私はmutexをスレッド間で同期するために使用したこのコードは、0から10までの3つの行をエレガントに印刷すると考えました。なぜmutexでスレッドから奇妙な印刷
#include <iostream>
#include <mutex>
#include <thread>
using namespace std;
struct A
{
void run()
{
lock_guard<mutex> l(mutex);
int i = 0;
while (i <= 10)
cout << "i = " << i++ << endl;
}
std::mutex mut;
};
int main()
{
A a;
thread t1(&A::run, &a);
thread t2(&A::run, &a);
thread t3(&A::run, &a);
t1.join();
t2.join();
t3.join();
}
何らかの理由で出力の開始が常に多少なりとも損なわれます。残りの部分は時には大丈夫、時にはそうではない。だから、明らかに、それは同期されていません。あるスレッドがmutexをロックすると、他のスレッドはrunメソッドの本体に入りません。しかし、明らかにそれは真実ではありません。
i = i = 00i = 0
i = 1
i = 2
i = 3
誰かがこれを説明できますか?
スレッドコンストラクタの 'a'オブジェクトをstd :: refで囲む必要があるかもしれないと思ったが、これは役に立たない。
問題に直面したときには、「私が知っている、私はスレッドを使用します」と思う人もいれば、2人がerpoblesmsを持っています。 – Slava
'lock_guard l(mutex);'と 'std :: mutex mut;'? –
役に立たなくても、ロックの使用が魅力的ではないことがわかりました。ロックガードを持つ印刷メソッドを作成し、ループ内からprintメソッドを呼び出します。ロックは可能な限り最小限に抑える必要があります。印刷を守る必要があるときだけ、すべての「実行」メソッドをブロックすることはできません。 – Kieveli