同步2个线程c ++ linux

时间:2017-05-23 08:12:28

标签: linux multithreading mutex

我有这样的代码

#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上实现相同的结果?

1 个答案:

答案 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)