一段LINUX下常用的多线程程序代码
2008-10-22 14:22
357 查看
好久没有更新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; } |
相关文章推荐
- 多线程程序一段问题代码分析
- 多线程程序一段问题代码分析(生产者消费者)
- Linux程序的常用信号中断捕获代码
- 实现一个无锁的Stack,并写一段测试代码(多线程访问),证明这个Stack是线程安全的。给出程序以及运行的截图。
- ASP.NET 程序中常用的三十三种代码
- 在Linux中#!/usr/bin/python之后把后面的代码当成程序来执行。 但是在windows中用IDLE编程的话#后面的都是注释,之后的代码都被当成文本了。 该怎么样才能解决这个问题呢?
- 使用 C++11 编写 Linux 多线程程序
- ASP.NET程序中常用编程代码(1)
- Linux常用命令(四)程序的安装与管理
- 英特尔:Linux操作系统的处理器微代码修补程序来了
- C程序实现在lcd 上全屏写 blue 色 及获取fb信息 ----》linux 应用层代码
- ASP.NET程序中常用的三十三种代码(强荐)! [转]
- JAVA多线程的一段代码
- ASP.NET程序中常用代码汇总(四)
- 浅析Dedecms程序SEO常用的列表标签调用代码集合
- [转]ASP.NET程序中常用的三十三种代码
- ASP.NET程序中常用的三十三种代码
- Linux多任务编程 编写多进程程序及其代码
- ASP.NET程序中常用编程代码(一)
- asp.net程序中最常用的三十三种编程代码标签