C++ 11多线程编程--std::lock_guard类

原创 2016年08月31日 16:28:40
 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++11多线程编程之Lock讲解

Lock类型 C++11提供两种基本类型的lock 1、lock_guard 方便线程对互斥量上锁 2、unique_lock 方便对互斥量上锁,但是提供了更好的上锁和解锁control 与锁相关...

Cocos2dx 3.0 过渡篇(二十七)C++11多线程std::thread的简单使用(下)

本篇接上篇继续讲:上篇传送门:http://blog.csdn.net/star530/article/details/24186783 简单的东西我都说的差不多了,想挖点深的差点把自己给填进去...

C++11多线程——<future>之std::promise学习

Promise对象可保存T类型的值,该值可被future对象读取(可能在另一个线程中),这是promise提供的同步的一种手段。在构造promise时,promise对象可以与共享状态关联起来,这个共...

一、C++11多线程std::thread的简单使用(上)

出处:http://blog.csdn.NET/star530/article/details/24186783 昨天练车时有一MM与我交替着练,聊了几句话就多了起来,我对她说:”看到前面那俩教练没?...

【Cocos2d-x 3.0】C++11多线程std::thread的简单使用(转)

转自:http://www.cocoachina.com/cocos/20140523/8530.html 本篇介绍的是线程!   在cocos2d-x 2.0时代,我们使用的是...

一、C++11多线程std::thread的简单使用(上)

出处:http://blog.csdn.net/star530/article/details/24186783 昨天练车时有一MM与我交替着练,聊了几句话就多了起来,我对她说:”看到前面那俩教练没...

C++11多线程——lock详解

C++11提供了两种管理锁的类 std::lock_guard:与mutex RAII相关,方便线程对互斥量上锁std::unique_lock:   与mutex RAII相关,方便线程对互斥量...

C++11多线程(四):lock详解

参考链接:http://www.cnblogs.com/haippy/p/3346477.html 目录 1.c++11 lock介绍 2.std::lock_guard 3.std::unique_...

std::lock_guard 引起的思考

std::lock_guard 引起的思考 版权声明:本文为 cheng-zhi 原创文章,可以随意转载,但必须在明确位置注明出处! 从哪里来的思考?最近在项目总结过程中,发现项目大量使用了 s...

c++11多线程编程之condition_variable

c++11多线程编程之condition_variable 主要从一个问题出发,编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 11多线程编程--std::lock_guard类
举报原因:
原因补充:

(最多只允许输入30个字)