知方号

知方号

C++ lock

C++多线程编程需要对共享的数据进行写保护,以防止多线程在对共享数据成员进行并发写时造成资源争抢而导致出现崩溃或其他不符合预期的结果。通常的做法是在修改共享数据成员前先对互斥锁mutex进行lock加锁,在修改后再进行unlock操作,这个场景中经常会出现由于疏忽或异常导致lock之后未能unlock,最终导致死锁。

针对以上的问题,C++11中引入了std::unique_lock与std::lock_guard两种数据结构。通过对lock和unlock进行一次薄的封装,实现自动unlock的功能。

目录 隐藏 一、lock_guard 1.特点 2.实例 二、unique_lock 1.特点 2.不加锁实例 3.返回lock实例 4.条件变量实例 三、总结 一、lock_guard

lock_guard是一个互斥量包装程序,它提供了一种方便的RALL(Resource accquisition is initialization)风格的机制来在作用域块的持续时间内拥有一个互斥量。

创建lock_guard对象时,它将尝试获取提供给他的互斥锁的所有权。当控制流离开lock_guard对象的作用域时,lock_guard析构并释放互斥量。

1.特点创建即加锁,作用域结束自动析构并解锁,无需手工解锁不能中途解锁,必须等作用域结束才解锁不能复制2.实例#include #include #include std::mutex mtx; // 全局互斥锁int gi = 0; //多线程共享变量void thread_mutex_lockguard(const int i){ std::lock_guard lock(mtx); //持有互斥锁 //std::unique_lock lock(mtx); //持有互斥锁(可以用unique_lock替代lock_guard) gi += i; //操作共享变量 std::cout

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。