Multithreading 阻止原子变量周围的多个线程。条件变量还是别的什么?

Multithreading 阻止原子变量周围的多个线程。条件变量还是别的什么?,multithreading,c++11,Multithreading,C++11,我正在尝试设计一个系统,其中我将有多个线程。所有这些线程每次共享一个公共变量(原子变量),当每个线程开始时,它递增该变量,在该线程结束之前,它递减该变量。如果该变量的当前值大于某个特定的限制值,我希望线程阻塞。一个简单的伪代码如下: std::atomic<int> var; int limit = 3; //limit value void doWork() //This method is run as multiple thread simultaneously { if(

我正在尝试设计一个系统,其中我将有多个线程。所有这些线程每次共享一个公共变量(原子变量),当每个线程开始时,它递增该变量,在该线程结束之前,它递减该变量。如果该变量的当前值大于某个特定的限制值,我希望线程阻塞。一个简单的伪代码如下:

std::atomic<int> var;
int limit = 3; //limit value
void doWork() //This method is run as multiple thread simultaneously
{
  if(var.load() < limit) 
  {
     //block until this condition is met
  }
  //increment
  var++;
  //Do some work
  .....
  //Decrement before leaving
  var--
}

您描述的行为听起来很像信号灯的行为:您应该在
var++
之后和“做一些工作”之前解锁。不,如果谓词已经满足,则第一个线程不会阻止调用
条件变量::wait
实际上不会等待;只有当它为假时,它才会等待,直到它变为真。
std::condition_variable cv;
std::mutex cv_m;
std::atomic<int> var;
int limit = 3; //limit value
void doWork()
{
  std::unique_lock<std::mutex> lk(cv_m);
  std::cerr << "Waiting... \n";
  cv.wait(lk, []{
         return var.load() < limit
        });
  //Increment var
   var++;
  //Do some Work
  ...
  //Decrement Work
  var--
  cv.notify_all();
}