多线程 看这一篇就够了,持续更新

1.多线程的初级创建

此处适用于开辟的线程函数仅执行一遍,即非重复性动作
头文件:#include"thread"
使用多线程时需要通过成员变量来实现,故需要在应用多线程的类的头文件中增加类的成员变量,语法如下: std::thread* m_thrTest{nullptr};
在开启线程的位置的语句为: m_thrTest =new std::thread(testProcess,this);
其中testProcess线程处理的回调函数,即为实际处理函数。this为传入参数。

传入参数不仅可以是this,也可以直接将各个参数(非成员变量)传入到回调函数,不必传入this,

出入值可以直接传值,也可以传引用,但是由于不同线程间传值也是-将值传入到相应线程,索引传引用也不能改变调用线程的值,可以通过std::ref(x)方式改变引用值,注回调函数的参数应为引用方式传值。

2.多线程的二级创建

此处适用于开辟的线程函数需执行重复性动作,且绝大多数情况为重复性动作。
注意点1:循环(while语句)的判断应为退出标志,易于空值函数的退出,
注意点2:执行循环语句时需要sleep一下,否则极易出问题;

std::chrono::milliseconds dur = std::chrono::milliseconds(10);
std::this_thread::sleep_for(dur);

3.线程的删除

1.退出标志置位
2.判断线程成员变量是否为joinable,而后执行join函数,等待函数执行完成,注意,此处最好不要用detech,detech会将该线程与主线程(创建该线程的线程)脱离关系,如果涉及数据交换会出现意想不到的问题。
3.删除线程成员变量,并将该指针置空。

4.多线程的锁

针对于线程与线程间(子线程与主线程间、子线程和子线程间)存在同时访问变量时需要对数据加锁。

4.1互斥体

头文件
创建互斥体变量
std::mutex m_lock;

m_lock.lock;
iCountNumber++;//被保护的变量
m_lock.unlock;

改用法必须是lock、unlock配套使用,否则获得锁的线程会一直占有该锁,其余线程无法获得锁,会一直处于等待状态;
可以通过lock_guard函数定义变量,创建变量时加锁,析构时解锁,语法如下:

 std::lock_guard<std::mutex> guard(m_testLock);

注意:注意该变量的作用范围,即控制变量析构的时间,否则会有一个线程持续占有锁,导致其他线程执行的时间占比太小。

4.2 条件变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值