1. 程式人生 > >c/c++ 多執行緒 std::lock

c/c++ 多執行緒 std::lock

多執行緒 std::lock

當要同時操作2個物件時,就需要同時鎖定這2個物件,而不是先鎖定一個,然後再鎖定另一個。同時鎖定多個物件的方法:std::lock(物件1.鎖,物件2.鎖...)

額外說明:lock_guard<mutex> lock_a(d1.m, std::adopt_lock);

上面這句是為了解開std::lock的鎖。

引數std::adopt_lock的作用:告訴lock_guard,d1.m已經被上鎖了,你不要再去鎖它了,沿用它原來的鎖就好。

例子:

#include <list>
#include <iostream>
#include <mutex>
#include <algorithm>
#include <thread>
#include <unistd.h>

using namespace std;
class data_protect;
void swap(data_protect& , data_protect& );
//是執行緒安全的
class data_protect{
  friend void swap(data_protect& , data_protect& );
private:
  list<int> alist{1,2};
  mutex m;
public:  
  void add_list(int val){
    //操作雙向連結串列時,加鎖了
    lock_guard<mutex> g(m);
    alist.push_back(val);
  }
  bool contains(int val){
    //操作雙向連結串列時,加鎖了
    lock_guard<mutex> g(m);
    return find(alist.begin(), alist.end(), val) != alist.end();
  }
};

void swap(data_protect& d1, data_protect& d2){
  std::lock(d1.m, d2.m);
  //造成死鎖
  //d1.add_list(11);
  lock_guard<mutex> lock_a(d1.m, std::adopt_lock);
  lock_guard<mutex> lock_b(d2.m, std::adopt_lock);
  swap(d1.alist, d2.alist);
}
int main(){
  data_protect d1, d2;
  swap(d1, d2);
}

github原始碼

c/c++ 學習互助QQ群:877684253

本人微信:xiaoshitou5854