队列可能会泄漏数据吗?或者我的线程代码中有错误



我有一个数据结构:

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

最新更新