C++多线程 互斥量、死锁

本文介绍了C++中多线程编程的互斥量概念,包括mutex、lock_guard和unique_lock的使用,以及如何避免死锁问题。重点讲述了互斥量在确保数据安全和提高并发效率上的作用,以及各种锁的不同特性和应用场景。同时,文章探讨了死锁的产生条件和预防措施,如统一加锁顺序、超时策略和一次性锁定多个锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在多线程的使用中,如果我们创建了多个线程,多个线程之间的执行顺序是由cpu来完成调度的,因此我们如果需要在多线程中进行数据共享和通信,就需要注意数据安全的问题,有可能我在一个线程中正在执行对数据的操作,此时cpu通过上下文切换,把当前线程切换掉了,开始执行了别的线程,而别的线程本来希望的是拿到我处理过后的数据,而现在拿到的数据是还没有处理完成的数据,这样当然就出现了数据传输的错误,这样的错误一般出现在读写操作,如果当前进程是只读的话,是不会影响数据安全的。为了避免这种我在操作中被切换中断的行为发生,就需要引入互斥量的概念,也就是我们常说的锁。

1,mutex
mutex是一个class,其中包含有成员函数,lock()、unlock()、try_lock(),

std::mutex mymutex;

通过上述语句就可以直接构造出一个互斥量对象,也就是构造出了一把锁,在创建时它是unlock状态,因此我们就可以去使用lock。我们在线程中使用lock()和unlock(),也就是说获取并锁上这把锁和打开这把锁并释放所有权,并在加锁和解锁的语句之间加入自己想要保护的代码段,这样在执行到当前代码段后,cpu就不会进行线程的切换任务。

mymutex.lock();//加锁

//....想要被保护的操作

mynutex.unlock();//解锁

需要注意的是,加锁解锁需要成对使用,加锁后一定就要完成锁的解锁,而且我前面说了lock是尝试获取这把锁并加锁,因此如果多个线程中只有一个线程可以获取到当前的锁,如果一个获取到了,另一个线程只有在锁被释放后才能继续尝试获取锁,并且lock和unlo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值