我正在尝试解决多生产者单个消费者问题,生产者生成整数,消费者从所有这些整数中生成排序列表(使用AVL树)。我该如何锁定树数据结构?还是没必要?队列具有适当的锁定以进行推送和弹出操作。
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(多线程生成器=&gt;主线制作的线程):
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";
}
答案 0 :(得分:1)
由于队列将被所有生产者和消费者访问,因此访问需要同步。但是如果单个消费者使用树,为什么要锁定它呢?锁定是不必要的,将导致额外的开销。