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 并发指南三(std::mutex 详解)

Mutex又称互斥量,C++11中与Mutex相关的类和函数声明都在头文件中,所以使用时必须包含头文件 1、mutex头文件介绍 Mutex类系列(4种) 1)std::mutex:最基本的mu...
  • yuxikuo_1
  • yuxikuo_1
  • 2014年12月17日 14:39
  • 2117

C++11多线程基本使用

C++11增加了线程及线程相关的累,很方便的支持了并发编程,使得编写的多线程程序的可移植性得到了很大的提高....
  • wrx1721267632
  • wrx1721267632
  • 2016年08月13日 11:31
  • 2930

c++ 11 多线线程系列-------- 一个最简单而且实用的线程池

至于什么是线程池,线程池是干神马的,大家自己网上查阅一下。 #include #include #include #include #include #include #inc...
  • chenxun2009
  • chenxun2009
  • 2015年11月24日 22:52
  • 935

C++11 多线程学习----std::thread类的简单使用

C++11标准库会提供类thread(std::thread)。若要运行一个线程,可以创建一个类thread的实体,其初始参数为一个函数对象,以及该函数对象所需要的参数。通过成员函数std::thre...
  • u013507368
  • u013507368
  • 2015年04月15日 22:41
  • 3750

C++11多线程(六):《<future> 详解二:std::packaged_task 介绍》

参考连接: http://www.cnblogs.com/haippy/p/3279565.html 不错的博客 http://www.cplusplus.com/reference/futu...
  • ceasadan
  • ceasadan
  • 2016年01月05日 14:39
  • 641

C++11中多线程例子

C++11开始,自带线程相关的操作库。这里举个例子,以并发编程最经典的例子,生产者消费者的例子来示例在C++11使用标准库提高的线程库来进行并发编程。这里为了方便线程的使用,参考了android源码中...
  • zhx6044
  • zhx6044
  • 2016年03月31日 21:10
  • 1655

C++11线程安全队列和安全栈

文章代码取自C++11并发编程指南,记录于此方便日后查看
  • beichen_yx
  • beichen_yx
  • 2017年05月08日 09:47
  • 324

C++11 并发编程教程&学习笔记

C++11 并发编程教程&学习笔记 参考: 1、原文:http://baptiste-wicht.com/posts/2012/03/cpp11-concurrency-part1-st...
  • huhaijing
  • huhaijing
  • 2016年06月24日 19:07
  • 892

C++使用thread类多线程编程

C++11中引入了一个用于多线程操作的thread类,简单多线程示例: #include #include #include using namespace std; void thread...
  • dcrmg
  • dcrmg
  • 2016年12月28日 20:23
  • 11662

C++11 学习笔记 std::function和bind绑定器

一.std::function       C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法五花八门。为了统一泛化函数对象,函数指针,引用函数,...
  • fjzpdkf
  • fjzpdkf
  • 2015年12月10日 14:18
  • 1436
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 11多线程编程--std::lock_guard类
举报原因:
原因补充:

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