나는 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
누군가 설명 할 수 있습니까?
나는 thread 생성자에서 'a'객체를 std :: ref로 둘러 쌀 필요가 있다고 생각했지만, 그렇지 않아도 도움이되지 않습니다.
어떤 사람들은 문제에 직면했을 때 "나는 쓰레드를 사용할 것입니다."라고 생각하고, 두 사람은 erpoblesms을 사용합니다. – Slava
'lock_guard l (mutex); 그리고'std :: mutex mut;'? –
도움이되지 않지만 잠금 장치를 사용하면 매력적이지 않습니다. 잠금 가드가있는 인쇄 메서드를 만들고 루프 내에서 print 메서드를 호출합니다. 잠금 장치는 가능한 한 최소한으로 차단되어야합니다. 인쇄를 지켜야 할 때만 모든 '실행'방법을 차단할 필요가 없습니다. – Kieveli