您的位置:首页 > 运维架构 > Linux

一段LINUX下常用的多线程程序代码

2008-10-22 14:22 323 查看
好久没有更新BLOG了,最近在做语音识别和语音合成方面的工作,粘一段自已写的用得比较多的LINUX多线程代码,做个记录,方面以后查阅吧。代码的作用是,主线程负责将要处理的数据放入队列,另外一个新线程负责处理队列中的数据,如果没有数据新线程将睡眠等待,有新数据到来时主线程会唤醒新线程,就这么简单。。。随手写的程序,存在问题希望能告诉我:)

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#ifndefBOOL
#defineBOOLint
#endif
#ifndefTRUE
#defineTRUE1
#endif
#ifndefFALSE
#defineFALSE0
#endif
staticBOOLbIncomingNewData=FALSE;
pthread_cond_tcondDataready=PTHREAD_COND_INITIALIZER;/*条件变量*/
pthread_mutex_tlock=PTHREAD_MUTEX_INITIALIZER;/*互斥量*/
#defineQUEUE_SIZE255
staticvoid*queueArray[QUEUE_SIZE];/*用数组实现环型队列*/
staticintqueueFront=-1;/*队首*/
staticintqueueEnd=-1;/*队尾*/
/*入队*/
staticintinQueue(void*p)
{
if(queueFront==-1&&queueEnd==-1){
queueFront=queueEnd=0;
queueArray[queueFront]=p;
return0;
}
intend=queueEnd+1;
if(end>=QUEUE_SIZE){
end=0;
}
/*队列已经满了*/
if(end==queueFront){
return-1;
}
queueArray[end]=p;
queueEnd=end;
return0;
}
/*出队*/
staticvoid*outQueue()
{
/*队列是空的*/
if(queueFront==-1&&queueEnd==-1){
return0;
}
void*pRet;
if(queueFront==queueEnd){
pRet=queueArray[queueFront];
queueFront=queueEnd=-1;
returnpRet;
}
pRet=queueArray[queueFront++];
if(queueFront>=QUEUE_SIZE){
queueFront=0;
}
returnpRet;
}
/*线程函数*/
void*threadFunc(void*arg)
{
staticvoid*localArray[QUEUE_SIZE];
staticintlocalDataCount=0;
void*pData;
inti;
for(;;){
pthread_mutex_lock(&lock);
/*睡眠并等待队列中有数据*/
while(!bIncomingNewData){
pthread_cond_wait(&condDataready,&lock);
}
/*将数据复到到局部数量等待处理*/
while((pData=outQueue())!=0){
localArray[localDataCount++]=pData;
if(localDataCount>=QUEUE_SIZE){
break;
}
}
bIncomingNewData=FALSE;
pthread_mutex_unlock(&lock);
/*逐个处理数据*/
for(i=0;i<localDataCount;i++){
printf("/n##processing%d##/n",(int)localArray[i]);
sleep(5);
}
localDataCount=0;
}
}
intmain(void)
{
pthread_tthreadId;
intdata;
interr=pthread_create(&threadId,NULL,threadFunc,NULL);
if(err!=0){
printf("can'tcreatethread!/n");
return-1;
}
while(1){
printf(">>>inputanumbertoprocess:");
scanf("%d",&data);
getchar();
pthread_mutex_lock(&lock);
/*添加数据入队列,并唤醒线程*/
if(inQueue((void*)data)==0){
bIncomingNewData=TRUE;
pthread_cond_signal(&condDataready);
}
pthread_mutex_unlock(&lock);
}
err=pthread_join(threadId,NULL);
if(err!=0){
printf("pthread_joinreturnerror!/n");
return-1;
}
return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: