Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mutex lock/unlock order

Tags:

c++

mutex

I am interesting whether mutexes(not depending on particular language) must keep the order of lock/unlock?
Here is example C++ code:

std::mutex testVecMtx;
std::vector<int> testVec;

void testPush(int v){
  std::lock_guard<std::mutex> lk(testVecMtx);

  if (testVec.empty()){
    // wait some time to get more threads waiting on testVecMtx
    std::this_thread::sleep_for(std::chrono::milliseconds(3000));
  }

  testVec.push_back(v);
}

void Main_TEST(){
  std::list<std::thread> thList;

  for (int i = 0; i < 1000; i++){
    thList.push_front(std::thread(testPush, i));
  }

  for (auto &i : thList){
    if (i.joinable()){
        i.join();
    }
  }

  bool ok = true;

  for (int i = 0; i < (testVec.size() - 1) && ok; i++){
    ok = testVec[i + 1] - testVec[i] == 1;
  }

  if (ok){
    int stop = 243; // 1st breaking point here...
  }
  else{
    int stop = 432; // ...and 2nd here
  }
}

After running this code in VS2013 serveral times in Debug and Release(with some changes to get code not optimized out) mode I always get hit only on 1st breakpoint.

like image 354
user2440195 Avatar asked Feb 23 '15 21:02

user2440195


1 Answers

No, there are no guarantees about the order. It just happens to work this way on your machine(for instance, on my computer ok is not always true).

like image 194
kraskevich Avatar answered Nov 15 '22 00:11

kraskevich