锁定多个生产者单个消费者

Locking in Multiple producer single consumer

本文关键字:单个 消费者 生产者 锁定      更新时间:2023-10-16

我正试图解决一个多生产者单一消费者问题,生产者生成整数,消费者从所有这些整数(使用AVL树)中生成排序列表。如何锁定树形数据结构?还是没有必要?队列对push和pop操作有适当的锁定。

void consumer(NaiveQueue<nodeQ> &obj)
{
    while(1)
    {
    nodeQ *temp;
    temp=NULL;
    temp=obj.pop();
    if(temp)
      {
        cout << "nRemoved : " << temp->data;
        root=insert(root,temp->data); //****lock this??????
        delete temp;
      }
   }  
}

Producer(多线程Producer => threads made in main):

void makeChildThread(int &newsockfd,char msg[MAXSZ],NaiveQueue<nodeQ> &obj)
{
   //receive from client
   while(1)
   {
    int n=recv(newsockfd,msg,MAXSZ,0);
    if(n==0)
    {
     close(newsockfd);
     break;
    }
    //msg[n]=0;
    //send(newsockfd,msg,n,0);
    int val=atoi(msg);
    if(val == 0)
    {
        break;
        exit(0);
    }
    nodeQ *temp;
    temp=new nodeQ();
    temp->data=val;
    obj.push(temp);
    cout<<"nPushed : "<<val;
    cout<<"nReceived :"<<msg;
   }//close while
    cout<<"nExit from thread";
}

由于队列将被所有生产者和消费者访问,因此访问需要同步。但是如果树被单个消费者使用,为什么要锁定它呢?锁是不必要的,会造成额外的开销。