c11多线程lock详解

上传人:工**** 文档编号:509526161 上传时间:2023-03-24 格式:DOC 页数:14 大小:166KB
返回 下载 相关 举报
c11多线程lock详解_第1页
第1页 / 共14页
c11多线程lock详解_第2页
第2页 / 共14页
c11多线程lock详解_第3页
第3页 / 共14页
c11多线程lock详解_第4页
第4页 / 共14页
c11多线程lock详解_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《c11多线程lock详解》由会员分享,可在线阅读,更多相关《c11多线程lock详解(14页珍藏版)》请在金锄头文库上搜索。

1、c+11 多线程 lock 详解C+11 多线程 lock 详解标签:C+11 多线程 lock详解学习 2015-04-17 11:37 2458 人阅读评论 (0) 收藏举报分类:多线程(3)C/C+ (15)目录 (?)+C+11提供了两种管理锁的类std:lock_guard :与mutex RAII相关,方便线程对互斥量上锁std:unique_lock:与mutex RAII相关,方便线程对互斥量上锁,相比std:lock_guard提供了更好的上锁和解锁控制一lock_guard详解lock_guard是一个模板类:template<classMutex>class

2、lock_guard;lock_guard 对象通常用来管理某个锁 (Lock) 对象,与 Mutex RALL 相关,方便线程对互斥量上锁,在其声明周期内,它管理的锁一直保持上锁状态;在其声明周期结束之后,它锁管理的锁会被自动释放 (即用构造函数对锁对象上锁,析构函数对锁对象解锁)模板参数 Mutex 代表几种基本的BasicLockable 类型分别为:std:mutex, std:recursive_mutex, std:timed_mutex,std:recursive_timed_mutex 以及std:unique_lock,(BasicLockable 类型只需满足两种操作, l

3、ock 和 unlock 。 Lockable 类型在 BasicLockable 的基础上增加了 try_lock 操作。 TimedLockable 类型在 Lockable 的基础上又增加了try_lock_for 和 try_lock_until操作。 )注意: lock_guard 对象并不负责管理Mutex 对象的生命周期,它只是简化了mutex的上锁和解锁操作,再其生命周期内,它锁管理的锁对象会一直保持上锁状态;声明周期结束之后,它锁管理的锁对象会被自动解锁。 其最大的优点是安全易用( 在出现异常时依旧可以正确解锁,一定程度上避免了死锁)。lock_guard 构造函数如下所示l

4、ocking-constructor (a)exlicit lock_guard(mutex_type& m);adopting-constructor(b)lock_guard(mutex_type&m,adopt_lock_ttag);copy(deleted)-constructor (c)lock_guard(const lock_guard&) =delete; a locking-constructorlock_guard 对象管理Mutex 对象 m,并在构造时对m 上锁 b adopting-constructor初始化lock_guard 对象管理 M

5、utex 对象 m,与locking 初始化不同的是, Mutex 对象以被当前线程锁住。(将mutex 对象用 adopting:lock_guard 管理,最终在调用lock_guard 析构函数时, m 锁对象会被自动解锁 )ccopy-constructorlock_guard 的拷贝构造与移动构造均被禁用 locking-constructor examplescpp view plaincopy#include <iostream>#include <thread>#include <mutex>#include <stdexcept>

6、;std:mutex mtx;void printEven(int x) if (0 =x % 2)std:cout << x << isevenn;elsethrow(std:logic_error(not evenn); voidprintThreadID(int id)trystd:lock_guard<std:mutex>lck(mtx);printEven(id);catch (std:logic_error&e)/std:cout << e.what() << std:endl;std:cout <<

7、exception caughtn; intmain(int argc, _TCHAR* argv)std:threadthreads10;for (int i = 0; i < 10;+i)threadsi = std:thread(printThreadID, i +1);for (auto &th : threads)th.join();return 0;在voidprintThreadID(int id)中,首先捕捉voidprintEven(int x) 中抛出的异常, 在 try 块内,首先对 mtx 锁对象构造 lock_guard 对象 lck( 此语句之后, m

8、tx 锁对象由 lck 管理 ),即在 try 块作用域内 (也就是 lck 对象生命周期内 ),mtx 锁对象被上锁, 在lck 生命周期结束时mtx 锁对象自动解锁(在抛出异常时,依旧可正确解锁 )。 adopting-constructor examplecpp view plaincopy#include <iostream> #include <thread> #include <mutex> std:mutex mtx; void printThreadID(int id) mtx.lock();std:lock_guard<std:mut

9、ex>lck(mtx, std:adopt_lock);std:cout << thread # << id << n;void testAdoptingConstructor()std:threadthreads10;for (int i = 0; i < 10; +i)threadsi = std:thread(printThreadID, i +1);for (auto& th : threads)th.join();int main(int argc,_TCHAR* argv)testAdoptingConstructor();r

10、eturn 0;在 void printThreadID(int id)中,首先对 mtx 上锁,之后调用lock_guard 的 adopting-constructor 来构造 lck ,用 lck 管理 mtx 锁对象。 (注意, std:adopt_lock 表明当前线程已获得锁 )二 std:unique_lockstd:unique_lock 简介std:unique_lock 与 std:lock_guard 一样用来管理锁对象(在抛出异常之前上锁的对象使用unique_lock 管理的锁对象也可正常解锁,可一定程度上避免死锁),其与 std:lock_guard 类似,但是给程

11、序员提供了足够的灵活度。在构造时,unique_lock 对相关需要一个Mutex 锁对象作为其参数, 新创建的 unique_lock 对象负责传入的Mutex 锁对象的上锁和解锁操作 unique_lock 与 lock_guard 一样,不负责管理 Mutex 锁对象生命周期 std:unique_lock 构造函数 default(a) unique_lock()noexcept;locking(b)explicit unique_lock(mutex_type&m);try_locking(c)unique_lock(mutex_type&m,try_to_lock_

12、t tag);deferred(d)unique_lock(mutex_type&m, defer_lock_ttag)noexcept;adopting(e)unique_lock(mutex_type&m,adopt_lock_ttag);lookingfor(f)template <classRep,classPeriod>unique_lock(mutex_type&m,constchrono:duration<Rep,Period>&rel_time); lockinguntil(g)template<classClock

13、,classDuration>unique_lock(mutex_type&m,constchrono:time_point<Clock,Duration>&abs_time);copydelete(h)unique_lock(const unique_lock&) =delete; move(i)unique_lock(unique_lock&&x);a default_constructor新创建的 unique_lock 对象不管理任何Mutex 锁对象 b lockingconstructor新创建的unique_lock对象管理锁对象m,并调用m.lock()对m 上锁,若另外某个unique_lock管理了该Mutex锁对象m,则当前线程会被阻塞。c try_locking

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号