我正在学习C++11中的多线程技术,我尝试了这个简单的测试,但输出结果并不是我预期的。
#include <thread>
#include <iostream>
#include <mutex>
int main() {
auto function = [](int x) {
std::mutex m;
m.try_lock();
std::cout << "Hello" << x << std::endl;
m.unlock();
return;
};
std::thread t1(function , 1);
std::thread t2(function, 2);
std::thread t3(function, 3);
std::thread t4(function, 4);
t1.join();
t2.join();
t3.join();
t4.join();
std::cin.get();
return 0;
}
我预期的输出结果是:
Hello1
Hello2
Hello3
Hello4
但是我得到了类似于这样的结果:
(也许不是按照这个顺序,但每个 "hello" 和数字都在单独的一行)
HelloHello21
Hello3
Hello4
或者
HelloHello2
1
Hello3
Hello4
除了互斥锁明显没有正确锁定之外,还有什么谜团呢?而且总是Hello1被切成两半。
编辑:使用VS2015完成,如果有什么区别(应该没有),请注意它全部都是标准的。
std::mutex m;
的定义移到函数外部。 - Nicholas Hamilton