我认为这个代码(我使用互斥体在线程之间进行同步)会优雅地打印从0到10的数字,3次在行中。为什么使用互斥体线程打印奇怪
#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();
}
但由于某种原因,输出的开始总是或多或少被破坏。其余的有时可以,有时不可以。显然,它不是同步的。这很奇怪,因为我期望当一个线程获得对互斥锁的锁定时,其他线程将不会进入run方法的主体。但显然这不是事实。
i = i = 00i = 0
i = 1
i = 2
i = 3
有人能解释这一点吗?
我想也许我需要围绕std :: ref的线程构造函数中的'a'对象,但不,这没有帮助。
有些人在遇到问题时会想:“我知道,我会用线程”,然后他们有两个有错误的地方。 – Slava
'lock_guard l(mutex);'和'std :: mutex mut;'? –
没有帮助,但我发现锁的使用没有引人注目。制作具有锁定防护的打印方法,并从循环内调用打印方法。锁应尽可能最小化阻塞。当您只需要保护打印时,没有任何阻碍所有“运行”方法的要点。 – Kieveli