您的位置:首页 > 编程语言 > C语言/C++

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还是会尝试获得锁导致线 塞。
// 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++ 多线程