我有一个数据结构:
struct {
mutex m;
condition_variable cv_p2c;
queue<int> qi;
bool finished;
} sdf_inst;
我有一个生产者,它生成100个整数,并在获得锁后将它们插入队列qi。
void producer () {
for(int i = 0 ; i < 100 ; i++ ) {
{
unique_lock<mutex> ulck(sdf_inst.m);//LOCK
sdf_inst.qi.push(i);
cout<<"adding "<<i<<endl<<flush;
}
sdf_inst.cv_p2c.notify_one();
}
unique_lock<mutex> ulck(sdf_inst.m);//LOCK
sdf_inst.finished=true;
sdf_inst.cv_p2c.notify_one();
}
插入所有数据后,它将获取锁并设置完成标志,然后退出。
我还有另一个消费者:
void consumer () {
while(true) {
unique_lock<mutex> ulck(sdf_inst.m);//LOCK
sdf_inst.cv_p2c.wait(ulck,[]{return sdf_inst.qi.empty()==false || sdf_inst.finished==true ; });
print_all();
if(sdf_inst.finished=true) return;
}
}
它只需要获取锁,等待生产者的通知,并使用下面的print_all函数打印队列qi中当前的所有数据:
void print_all () {
while(sdf_inst.qi.empty()==false) {
int i = sdf_inst.qi.front();
sdf_inst.qi.pop();
cout<<"shared_i "<< i <<endl<<flush;
}
return;
}
我认为它应该打印所有的100个数据,但有时它只打印其中的一部分。
我仔细研究了代码,没有发现同步错误,那么队列泄漏可能会导致数据丢失?
我在consumer()
:中找到了这个问题的原因
if(sdf_inst.finished=true) return;
应为
if ( sdf_inst.finished )
{
return;
}