前话
还记得上一节中main线程与子线程共同打印数据时候的那个运行结果吗。
你一定会很奇怪这个结果,我分明写了回车符的打印为什么有的语句没有打印回车符呢?这就涉及到操作系统在运行多线程时候的机制问题。
多线程的运行机制
在多线程程序运行的时候并不会等待一个主线程的语句执行完再执行子线程的语句,相反也不会等待一个子线程的语句执行完再执行主线程的语句,而是二者抢占式执行,谁抢到执行的权限谁就先执行,也就是说可能主线程的某个语句刚执行到一半,权限就被子线程抢去了,那么就执行子线程的语句,然后二者继续抢占式执行。所以就会产生上图所示的结果
正是因为这个机制所以导致了多线程在传输数据时的安全问题。
std::thread::join()
1.以值传入
来看下面的代码:
#include<iostream>
#include<thread>
void testThread(int a) {
while (true) {
std::cout << "传入的数据是:" << a << std::endl;
}
}
int main() {
int a = 0;
std::thread myThread(testThread, a);
myThread.join();
return 0;
}
完全没有问题,因为以值传入本身就是非常安全的。
2.以引用传入
让人头疼的时候开始了,当你兴致勃勃的改为以引用传入时,编译器毫不犹豫的报错了。
#i