探究在C++程序并发时保护共享数据的问题

2020-01-06 13:20:20王旭

然后我们不需要修改类来访问这个结构体,我们创建一个封装器:

 

 
  1. struct ConcurrentCounter {  std::mutex mutex; 
  2. Counter counter;   
  3. void increment(){  mutex.lock(); 
  4. counter.increment();  mutex.unlock(); 
  5. }   
  6. void decrement(){  mutex.lock(); 
  7. counter.decrement();   mutex.unlock(); 
  8. }  }; 

大部分时候该封装器运行挺好,但是使用 decrement 方法的时候就会有异常发生。这是一个大问题,一旦异常发生后,unlock 方法就没被调用,导致互斥量一直被占用,然后整个程序就一直处于堵塞状态(死锁),为了解决这个问题我们需要用 try/catch 结构来处理异常情况:

 

 
  1. void decrement(){  mutex.lock(); 
  2. try {  counter.decrement(); 
  3. } catch (std::string e){  mutex.unlock(); 
  4. throw e;  } 
  5. mutex.unlock();  }