我有这样的代码
#include <iostream>
#include <thread>
#include <mutex>
#include <iostream>
#include <unistd.h>
using namespace std;
bool isRunning;
mutex locker;
void threadFunc(int num) {
while(isRunning) {
locker.lock();
cout << num << endl;
locker.unlock();
sleep(1);
}
}
int main(int argc, char *argv[])
{
isRunning = true;
thread thr1(threadFunc,1);
thread thr2(threadFunc,2);
cout << "Hello World!" << endl;
thr1.join();
thr2.join();
return 0;
}
运行此代码时,我等待输出如下:
1
2
1
2
1
2
1
2
...
但是我没有得到这个并且得到这样的东西:
1
2
1
2
2 <--- why so?
1
2
1
如果我在Windows上运行此代码,将#include <unistd.h>
替换为#include <windows.h>
,将sleep(1)
替换为Sleep(1000)
,我得到的输出正是我想要的,即1212121212。< / p>
那么为什么会这样以及如何在linux上实现相同的结果?
答案 0 :(得分:1)
它涉及线程的调度。有时一个线程可能执行得更快。显然,线程2执行速度更快一次,所以你得到... 1 2 2 ...没错,因为互斥锁只能确保一次只有一个线程打印计数而已。有一些不确定因素,例如线程何时进入睡眠状态以及什么时候被唤醒等等。所有这些可能并不是一直在两个线程中完全相同的时间。
为了使线程交替执行,需要不同的信号量排列。例如,让两个信号量,s1和s2。设s1和s2的初始值分别为1和0。请考虑以下伪代码:
// Thread 1:
P (s1)
print number
V (s2)
// Thread 2:
P (s2)
print number
V (s1)