[关闭]
@lupnfer 2017-05-10T03:32:05.000000Z 字数 2779 阅读 1187

std::mutex

Code


refernce:
http://www.cplusplus.com/reference/mutex/unique_lock/unique_lock/
http://blog.csdn.net/liuxuejiang158blog/article/details/17263353

C11的mutex(互斥量) 跟boost的mutex还是存在一些特性区别的

boost 实现的读写锁

  1. typedef boost::shared_lock<boost::shared_mutex> readLock;
  2. typedef boost:: unique_lock<boost::shared_mutex> writeLock;
  3. boost::shared_mutex rwmutex;
  4. void readOnly() {
  5. readLock rdlock( rwmutex );
  6. /// do something
  7. }
  8. void writeOnly() {
  9. writeLock wtlock( rwmutex );
  10. /// do something
  11. }

unique_lock

  1. default (1) unique_lock() noexcept;
  2. locking (2) explicit unique_lock (mutex_type& m);
  3. try-locking (3) unique_lock (mutex_type& m, try_to_lock_t tag);
  4. deferred (4) unique_lock (mutex_type& m, defer_lock_t tag) noexcept;
  5. adopting (5) unique_lock (mutex_type& m, adopt_lock_t tag);
  6. locking for (6) template <class Rep, class Period>
  7. unique_lock (mutex_type& m, const chrono::duration<Rep,Period>& rel_time);
  8. locking until (7) template <class Clock, class Duration>
  9. unique_lock (mutex_type& m, const chrono::time_point<Clock,Duration>& abs_time);
  10. copy [deleted] (8) unique_lock (const unique_lock&) = delete;
  11. move (9) unique_lock (unique_lock&& x);
  12. Construct unique_lock

会导致deadlock的demo

right:

  1. // unique_lock constructor example
  2. #include <iostream> // std::cout
  3. #include <thread> // std::thread
  4. #include <mutex> // std::mutex, std::lock, std::unique_lock
  5. // std::adopt_lock, std::defer_lock
  6. std::mutex foo,bar;
  7. void task_a () {
  8. std::lock (foo,bar); // simultaneous lock (prevents deadlock)
  9. std::unique_lock<std::mutex> lck1 (foo,std::adopt_lock);
  10. std::unique_lock<std::mutex> lck2 (bar,std::adopt_lock);
  11. std::cout << "task a\n";
  12. // (unlocked automatically on destruction of lck1 and lck2)
  13. }
  14. void task_b () {
  15. // foo.lock(); bar.lock(); // replaced by:
  16. std::unique_lock<std::mutex> lck1, lck2;
  17. //defer_lock表示延迟加锁,此处只管理mutex
  18. lck1 = std::unique_lock<std::mutex>(bar,std::defer_lock);
  19. lck2 = std::unique_lock<std::mutex>(foo,std::defer_lock);
  20. std::lock (lck1,lck2); // simultaneous lock (prevents deadlock)
  21. std::cout << "task b\n";
  22. // (unlocked automatically on destruction of lck1 and lck2)
  23. }
  24. int main ()
  25. {
  26. std::thread th1 (task_a);
  27. std::thread th2 (task_b);
  28. th1.join();
  29. th2.join();
  30. return 0;

error:

  1. lock_guard<mutex> lock1(foo);
  2. lock_guard<mutex> lock2(bar);

unique_lock::lock(), unique_lock::unlock()这一组成员函数充分说明了,unique_lock在构造时不必对mutex加锁且可以在后期某个时候对mutex加锁; unique_lock可以在自己实例销毁前调用unique_lock::unlock()提前释放锁,这对于一些分支语句中可能得到性能提升。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注