我与多线程在C ++中使用互斥工作。我的代码如下:
#include "stdafx.h"
#include <thread>
#include <iostream>
#include <string>
#include <mutex>
using namespace std;
std::mutex mu;
void shared_print(string msg, int i) {
std::lock_guard<std::mutex> guard(mu);
cout << msg << i << endl;
}
void function_1() {
for (int i = 0; i > -3; i--)
shared_print("Thread1: ", i);
}
int main() {
std::thread thread1(function_1);
for (int i = 0; i < 3; i++)
shared_print("Main: ", i);
thread1.join();
return 0;
}
从我的理解,互斥体将只允许在同一时间访问一个单一的资源。所以互斥会调用它(Thread1
)的第一个线程被锁定。当main
线程试图访问该互斥,它被阻塞,直到该互斥已由Thread1
解锁。一旦cout
已经执行在其main
将被允许执行这将是畅通的。
我希望得到的结果是交错的呼叫如Thread1, Main, Thread1, Main
等。
但是,相反,我得到标准输出下面的结果。该模式仍然是任何迭代次数相同:
Thread1: 0
Thread1: -1
Thread1: -2
Main: 0
Main: 1
Main: 2
首先认识到,执行的顺序是不确定的,所以你得到了什么是完全有效的 - 并且在下一次运行它的时候,你可能会得到完全不同的次序。
我增加迭代次数每个线程运行32的是,在过去的几个迭代是这样的:
Thread1: -22
Main: 22
Thread1: -23
Main: 23
Main: 24
Thread1: -24
Main: 25
Thread1: -25
Main: 26
Thread1: -26
Main: 27
Thread1: -27
Thread1: -28
Thread1: -29
Main: 28
Main: 29
Main: 30
Main: 31
Thread1: -30
Thread1: -31
所以,有时我们得到交错,其他时候我们得到短期运行(4在这种情况下,最长)从一个线程来。我跑了其他时候,我得到了完美交织,使整个事情跑了从线程1一个输出,然后从主一个输出,并重复。
底线:你的代码工作正常。