C++ 11多线程编程--std::lock_guard类
2016-08-31 16:28
639 查看
std::lock_guard类是一个包装类,通过锁类可以更好的获得和释放一个互斥体上的锁;锁类的析构函数会自动释放关联的互斥体。
标准定义的两种类型的锁
std::lock_guard
std::unique_guard
<1> std::lock_guard
lock_guard 对象通常用于管理某个锁(Lock)对象,因此与 Mutex RAII 相关,方便线程对互斥量上锁,即在某个 lock_guard 对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 lock_guard 的
生命 周期结束之后,
它所管理的锁对象会被解锁(注:类似 shared_ptr 等智能指针管理动态分配的内 存资源 )。
lock_guard 对象并不负责管理 Mutex 对象的生命周期,lock_guard 对象只是简化了 Mutex 对象的上锁和解锁操作,方便线程对互斥量上锁,即在某个 lock_guard 对象声明周期内,它所管理的锁对
象会一直保持上锁状态;
而 lock_guard 的生命周期结束之后,它所管理的锁对象会被解锁。
在学习std::lock_guard之前,先来看下与std::lock_guard和std::unique_guard相关的lock_tag(在<mutex>中定义)
std::def_lock
std::try_to_lock
std::adopt_lock
std::def_lock, std::try_to_lock, std::adopt_lock 分别是空的struct标记类型defer_lock_t, try_to_lock_t, 和adopt_lock_t的实例
。定义如下:
struct defer_lock_t {};
struct try_to_lock_t {};
struct adopt_lock_t {};
它们被用来为std::lock_guard和 std::unique_guard指定locking策略。
defer_lock_t 不获取mutex的所有权(适用于std::unique_guard)
try_to_lock_t 试图获取mutex的所有权,但不会阻塞(译注:一旦失败就返回,若成功,则会获得mutex所有权)(适用于std::unique_guard)
adopt_lock_t 假设线程已经获得mutex的所有权(适用std::lock_guard和 std::unique_guard)
如果构造std::lock_guard之前 mutex已经获得锁 则需要在std::lock_guard 中指定std::adopt_lock,如果不指定std::adopt_lock,std::lock_guard还是会尝试获得锁导致线 塞。
标准定义的两种类型的锁
std::lock_guard
std::unique_guard
<1> std::lock_guard
lock_guard 对象通常用于管理某个锁(Lock)对象,因此与 Mutex RAII 相关,方便线程对互斥量上锁,即在某个 lock_guard 对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 lock_guard 的
生命 周期结束之后,
它所管理的锁对象会被解锁(注:类似 shared_ptr 等智能指针管理动态分配的内 存资源 )。
lock_guard 对象并不负责管理 Mutex 对象的生命周期,lock_guard 对象只是简化了 Mutex 对象的上锁和解锁操作,方便线程对互斥量上锁,即在某个 lock_guard 对象声明周期内,它所管理的锁对
象会一直保持上锁状态;
而 lock_guard 的生命周期结束之后,它所管理的锁对象会被解锁。
在学习std::lock_guard之前,先来看下与std::lock_guard和std::unique_guard相关的lock_tag(在<mutex>中定义)
std::def_lock
std::try_to_lock
std::adopt_lock
std::def_lock, std::try_to_lock, std::adopt_lock 分别是空的struct标记类型defer_lock_t, try_to_lock_t, 和adopt_lock_t的实例
。定义如下:
struct defer_lock_t {};
struct try_to_lock_t {};
struct adopt_lock_t {};
它们被用来为std::lock_guard和 std::unique_guard指定locking策略。
defer_lock_t 不获取mutex的所有权(适用于std::unique_guard)
try_to_lock_t 试图获取mutex的所有权,但不会阻塞(译注:一旦失败就返回,若成功,则会获得mutex所有权)(适用于std::unique_guard)
adopt_lock_t 假设线程已经获得mutex的所有权(适用std::lock_guard和 std::unique_guard)
如果构造std::lock_guard之前 mutex已经获得锁 则需要在std::lock_guard 中指定std::adopt_lock,如果不指定std::adopt_lock,std::lock_guard还是会尝试获得锁导致线 塞。
// lock_guard类.cpp : 定义控制台应用程序的入口点。 // constructing lock_guard with adopt_lock #include "stdafx.h" #include <iostream> // std::cout #include <thread> // std::thread #include <mutex> // std::mutex, std::lock_guard, std::adopt_lock std::mutex mtx; // mutex for critical section void print_thread_id(int id) { mtx.lock(); std::lock_guard<std::mutex> lck(mtx, std::adopt_lock); std::cout << "thread #" << id << '\n'; } int main() { std::thread threads[10]; // spawn 10 threads: for (int i = 0; i<10; ++i) threads[i] = std::thread(print_thread_id, i + 1); for (auto& th : threads) th.join(); return 0; } /*输出结果*/ /**** thread #1 thread #2 thread #3 thread #4 thread #5 thread #6 thread #7 thread #8 thread #9 thread #10 ****/
相关文章推荐
- C++ 并发编程,std::unique_lock与std::lock_guard区别示例
- 《C++ Concurrency in Action》笔记9 std::unique_lock源码分析
- C++ 编程之std::string的utils
- LinuxC/C++编程基础(35) std::istream使用实例
- C++ 并发编程之std::thread的基本用法
- C++多线程笔记:使用std::lock_guard实现对共享数据的保护
- 在 Borland C++BuilderX for Windows 中进行 GTK+ 编程
- Visual C++.NET编程基础讲座之一
- C/C++实际编程常见问题分析
- 编程经验点滴(二)——《C、C++中函数调用时参数压栈的顺序问题》
- 使用 C++ 的托管扩展针对 Windows 窗体编程
- 开篇,从Kingofark那转过来的 关于学习C++和编程的50个观点 2003修订版
- Visual C++.NET GDI+编程基础
- C++ 编程技巧
- Visual C++.NET编程基础讲座之三
- Visual C++.NET编程基础讲座之五
- 书评:C++网络编程,卷2 by Matthew Wilson
- 在 Borland C++BuilderX for Windows 中进行 GTK+ 编程
- kingofark关于学习C++和编程的50个观点
- 用C++ std::priority_queue 实现哈夫曼算法