C++中的线程

进程和线程的概念:

1、进程是一个正在执行的程序,是向CPU申请资源的,不同进程之间数据是相互独立的,而一个进程至少有一个线程。

2、线程是最小的控制单元,是进程中单一的顺序控制流程,是进程中的执行单元。

关于线程中的互斥锁:

方式一:

Mutex mut;

一旦上锁,即调用mut.lock()函数,只有在解锁之后才能用,即调用mut.unlock()函数。

方式二:

unique_lock<mutex>locker1(m_mutex, defer_lock);

defer_lock表示不对mutex加锁,只是管理mutex,此时mutex是没有加锁的状态!

方式三:

lock_guard<mutex>guard(mut);

调用lock_guard就是表示上锁,而且不需要自己解锁,会在程序执行结束时,通过lock_guard的析构函数解锁!

方式二和方式三的比较:

1.lock_guard无法被复制(=)和移动(move);

unique_lock可以被移动,此时mutex会被转移,原先的              将失效(unique_lock<mutex> lokcer = move(locker1));

2.unique_lock消耗更多的性能,但更有弹性,更加占用空间,速度慢,因为其需要维护其中的mutex

 lock_guard性能更优。

死锁的产生:多个线程申请资源时,发生相互等待的情况。

避免产生死锁的方法:

1、尽量只是用单个锁;

2、使用多个锁时保证上锁顺序一致;

3、使用lock自动管理互斥锁;

使用lock

Lock(m_mutex1, m_mutex2);

Lock_guard<mutex> guard1(m_mutex1, adopt_lock);

Lock_guard<mutex> guard2(m_mutex2, adopt_lock);

(参数adopt_lock表示不上锁,只是状态)



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值