微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

围绕原子变量阻止多个线程 conditional_variable 还是别的什么?

如何解决围绕原子变量阻止多个线程 conditional_variable 还是别的什么?

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

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.load < limit 时睡觉,但这看起来并不理想。第二种方法是使用 conditional_variable。我正在使用下面的方法,但我相信我在这里有两个问题

  1. 一个线程将在 cv.wait(lk,[]{return var.load()
  2. 多个线程不会工作,只有一个会工作 而其他人将被阻止。

如果有人可以建议我如何从下面的代码删除这些缺陷,或者是否有更好的方法,我将不胜感激?

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();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。