关闭

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

标签: C++多线程
74人阅读 评论(0) 收藏 举报
分类:
 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
****/

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:919次
    • 积分:94
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档