c++ unique_lock lock_guard

unique_lock

template <class Mutex> class unique_lock;

Unique lock

unique lock is an object that manages a mutex object with unique ownership in both states: locked and unlocked.

On construction (or by move-assigning to it), the object acquires a mutex object, for whose locking and unlocking operations becomes responsible.

The object supports both states: locked and unlocked.

This class guarantees an unlocked status on destruction (even if not called explicitly). Therefore it is especially useful as an object with automatic duration, as it guarantees the mutex object is properly unlocked in case an exception is thrown.

Note though, that the unique_lock object does not manage the lifetime of the mutex object in any way: the duration of the mutex object shall extend at least until the destruction of the unique_lock that manages it.

http://www.cplusplus.com/reference/mutex/unique_lock/

<mutex> 头文件介绍

Mutex 系列类(四种)

  • std::mutex,最基本的 Mutex 类。
  • std::recursive_mutex,递归 Mutex 类。
  • std::time_mutex,定时 Mutex 类。
  • std::recursive_timed_mutex,定时递归 Mutex 类。

Lock 类(两种)

  • std::lock_guard,与 Mutex RAII 相关,方便线程对互斥量上锁。
  • std::unique_lock,与 Mutex RAII 相关,方便线程对互斥量上锁,但提供了更好的上锁和解锁控制。
// unique_lock example
#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <mutex>          // std::mutex, std::unique_lock

std::mutex mtx;           // mutex for critical section

void print_block (int n, char c) {
  // critical section (exclusive access to std::cout signaled by lifetime of lck):
  std::unique_lock<std::mutex> lck (mtx);
  for (int i=0; i<n; ++i) { std::cout << c; }
  std::cout << ‘\n‘;
}

int main ()
{
  std::thread th1 (print_block,50,‘*‘);
  std::thread th2 (print_block,50,‘$‘);

  th1.join();
  th2.join();

  return 0;
}
Edit & Run

一篇文章:

boost库中thread多线程详解3——细说lock_guard

boost::lock_guard可以说是一种比boost::unique_lock轻量级的lock, 简单一些场景可以用它就行了。
看看它的源代码也很简单:

template<typename Mutex>
class lock_guard
{
private:
    Mutex& m;

    explicit lock_guard(lock_guard&);
    lock_guard& operator=(lock_guard&);
public:
    explicit lock_guard(Mutex& m_):
        m(m_)
    {
        m.lock();
    }
    lock_guard(Mutex& m_,adopt_lock_t):
        m(m_)
    {}
    ~lock_guard()
    {
        m.unlock();
    }
};

可以看到只有两个public方法,即构造和析构函数,也就是说,使用boost::lock_guard去guard一个mutex,必然是在boost::lock_guard的对象离开其作用域时unlock它所guard的mutex,不提供提前unlock的功能。
      而boost::unique_lock则提供这个功能,除了像boost::lock_guard一样在离开作用域时unlock它guard的mutex外,boost::unique还提供unlock函数,使用者可以手动执行unlock。此外,unique_lock还可以设置超时。

时间: 2024-11-07 19:44:48

c++ unique_lock lock_guard的相关文章

C++11中lock_guard和unique_lock的区别

c++11中有一个区域锁lock_guard,还有第二个区域锁unique_lock. 区域锁lock_guard使用起来比较简单,除了构造函数外没有其他member function,在整个区域都有效. 区域锁unique_guard除了lock_guard的功能外,提供了更多的member_function,相对来说更灵活一些. unique_guard的最有用的一组函数为: lock locks the associated mutex  (public member function)

C++11之 unique_lock和lock_guard避免死锁

#include <iostream> #include <fstream> #include <thread> #include <mutex> #include <string> using namespace std; class LogFile { public: LogFile() { f.open("log.txt"); } ~LogFile() { } void shared_print(string msg,

C++ 11 thread 基础用法 lock unlock join mutex joinable lock_guard unique_lock condition_variable wait notify_one notify_all asnyc future packaged_task promise

#include "pch.h"#include<iostream> #include<string> #include<vector> #include<list> // 线程相关头文件#include<thread>#include<mutex> #include<future>using namespace std; static int res = 0; //共享变量 演示使用互斥量读写. mu

std::unique_lock与std::lock_guard分析

背景 C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢,导致程序出现未定义或异常行为.通常的做法是在修改共享数据成员时进行加锁(mutex).在使用锁时通常是在对共享数据进行修改之前进行lock操作,在写完之后再进行unlock操作,但经常会出现lock之后离开共享成员操作区域时忘记unlock导致死锁的现象.针对以上的问题,C++11中引入了std::unique_lock与std::lock_guard两种数据结构.通过对lock和unloc

C++11 std::unique_lock与std::lock_guard区别及多线程应用实例

C++11 std::unique_lock与std::lock_guard区别及多线程应用实例 C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为.通常的做法是在修改共享数据成员的时候进行加锁--mutex.在使用锁的时候通常是在对共享数据进行修改之前进行lock操作,在写完之后再进行unlock操作,进场会出现由于疏忽导致由于lock之后在离开共享成员操作区域时忘记unlock,导致死锁. 针对以上的问题,C++11中引

[C++11 并发编程] 08 - Mutex std::unique_lock

相对于std::lock_guard来说,std::unique_lock更加灵活,std::unique_lock不拥有与其关联的mutex.构造函数的第二个参数可以指定为std::defer_lock,这样表示在构造unique_lock时,传入的mutex保持unlock状态.然后通过调用std::unique_lock对象的lock()方法或者将将std::unique_lock对象传入std::lock()方法来锁定mutex. #include <mutex> class some

基于std::mutex std::lock_guard std::condition_variable 和std::async实现的简单同步队列

C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为.通常的做法是在修改共享数据成员的时候进行加锁--mutex.在使用锁的时候通常是在对共享数据进行修改之前进行lock操作,在写完之后再进行unlock操作,进场会出现由于疏忽导致由于lock之后在离开共享成员操作区域时忘记unlock,导致死锁. 针对以上的问题,C++11中引入了std::unique_lock与std::lock_guard两种数据结构.通过对lock和

c/c++ 多线程 unique_lock的使用

多线程 unique_lock的使用 unique_lock的特点: 1,灵活.可以在创建unique_lock的实例时,不锁,然后手动调用lock_a.lock()函数,或者std::lock(lock_a, -),来上锁.当unique_lock的实例被析构时,会自动调用unlock函数,释放锁. unique_lock<mutex> lock_a(d1.m, std::defer_lock); 2,unique_lock的实例可以调用unlock函数.这个意味着,在unique_lock

使用std::lock 和 std::unique_lock来起先swap操作

在上面代码中std::unique_lock可以传进std::lock,因为std::unique_lock有unique_lock提借lock.try_lock.unlock成员函数. std::unique_lock有一个owner_lock函数来判断是否现在已经被锁定.你可以会说使用std::lock_guard可能稍微效率一点.但是std::unique_lock使用可以更灵活,一是可以延迟锁定,二是可以将lock的所有权传送给另一个scope. 原文地址:https://www.cnb