问题描述
我正在尝试设计一个系统,在其中我将拥有多个线程。所有这些线程一次共享一个公共变量(它是原子的),当每个线程启动时,它会增加该变量,并且在该线程结束之前它会减少该变量。如果该变量的当前值大于特定限制值,我希望线程阻塞。一个简单的伪代码是这样的:
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
。我正在使用下面的方法,但我相信我在这里有两个问题
如果有人可以建议我如何从下面的代码中删除这些缺陷,或者是否有更好的方法,我将不胜感激?
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 (将#修改为@)