stdthread并发unique_lock

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stdthread并发unique_lock相关的知识,希望对你有一定的参考价值。

1. std::unique_lock与std::lock_guard类似。通过对lock和unlock进行一次薄的封装,都能实现自动加锁与解锁功能,但是std::unique_lock要比std::lock_guard更灵活,占用空间相对更大一点且相对更慢一点。

1.1 主要成员函数

unique_lock() noexcept;//不管理任何 Mutex 对象
	
explicit unique_lock(mutex_type& m);
管理 Mutex 对象 m,并尝试调用 m.lock() 对 Mutex 对象进行上锁,如果此时另外某个 unique_lock 对象已经管理了该 Mutex 对象 m,则当前线程将会被阻塞。
(创建的 unique_lock 对象通常拥有 Mutex 对象的锁)

unique_lock(mutex_type& m, try_to_lock_t tag);
管理 Mutex 对象 m,并尝试调用 m.try_lock() 对 Mutex 对象进行上锁,但如果上锁不成功,并不会阻塞当前线程。

unique_lock(mutex_type& m, defer_lock_t tag) noexcept;
管理 Mutex 对象 m,但是在初始化的时候并不锁住 Mutex 对象。m 应该是一个没有当前线程锁住的 Mutex 对象。
(创建的则不会拥有锁)


unique_lock(mutex_type& m, adopt_lock_t tag);
管理 Mutex 对象 m, m 应该是一个已经被当前线程锁住的 Mutex 对象。(并且当前新创建的 unique_lock 对象拥有对锁(Lock)的所有权)。
(创建的 unique_lock 对象通常拥有 Mutex 对象的锁)

//相对时间
template <class Rep, class Period>
unique_lock(mutex_type& m, const chrono::duration<Rep,Period>& rel_time);
试图通过调用 m.try_lock_for(rel_time) 来锁住 Mutex 对象一段时间(rel_time)

//绝对时间	
template <class Clock, class Duration>
unique_lock(mutex_type& m, const chrono::time_point<Clock,Duration>& abs_time);
试图通过调用 m.try_lock_until(abs_time) 来在某个时间点(abs_time)之前锁住 Mutex 对象。

unique_lock(const unique_lock&) = delete;

//move
unique_lock(unique_lock&& x); 

eg .

std::mutex mut;  
  
void insert_data()  
  
       std::lock_guard<std::mutex> lk(mut);  
       queue.push_back(data);  
  
  
void process_data()  
  
       std::unqiue_lock<std::mutex> lk(mut);  
       queue.pop();  
  

以上是关于stdthread并发unique_lock的主要内容,如果未能解决你的问题,请参考以下文章

stdthread并发lockGuard

stdthread创建

stdthread死锁deadlock

C++11多线程 unique_lock详解

关于使用 std::unique_lock 的说明

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