c++11多线程并发编程(2) ——传参安全

本文介绍了C++11多线程编程中关于参数传递的安全问题,特别是`std::thread::join()`和`std::thread::detach()`的使用。在以引用传参时,由于线程抢占执行可能导致数据不一致,同时讲解了右值引用的限制和解决方案,如使用`const`、`mutable`以及`std::ref`来确保数据正确传递。最后提到了`detach()`可能导致的数据丢失问题,强调了线程同步的重要性。
摘要由CSDN通过智能技术生成

前话

还记得上一节中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
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值