linux下线程通过signal通信实例

来源:互联网 发布:mac os x10.9 cdr下载 编辑:程序博客网 时间:2024/05/18 15:51

 1. linux系统中根据需求可选取不同的进程和线程间通信的方式,罗列如下:


using namespace std;ServerMonitor* ServerMonitor::sServerMonitor=NULL;#include <pthread.h>#if 10//调式linux下多线程间通信方式int dataBuff[1000000];int wAction=0,rAction=0;int size=100;pthread_cond_t buffIsNotEmpty;pthread_cond_t buffIsNotFull;//根据进程名获得获取进程数,判断当前服务进程是否正常运行int ServerMonitor::GetPidNumber(){int spaceNumber=0;int i;char pidBuffer[128];memset(pidBuffer,0,sizeof(pidBuffer));FILE *fp;if((fp=popen(PS_COMMAND,"r"))==NULL){return 0;}fgets(pidBuffer,sizeof(pidBuffer),fp);for(i=0;i<strlen(pidBuffer);i++){if(isspace(pidBuffer[i])){spaceNumber++;}else{continue;}}printf("\r\n pidbuffer=%s, pid=%d  %d   %d\r\n",pidBuffer,spaceNumber,strlen(pidBuffer),sizeof(pidBuffer));return spaceNumber;}void *ServerMonitor::sMonitor(void *){printf("\r\n sMonitor \r\n");int x;while(1){printf("\r\n sMonitor2 \r\n");pthread_mutex_lock(&lock);if(rAction==wAction){printf("\r\n sMonitor3\r\n");pthread_cond_wait(&buffIsNotEmpty,&lock);}printf("\r\n sMonitor3\r\n");x=dataBuff[rAction++];if(rAction>=size){rAction=0;}pthread_mutex_unlock(&lock);pthread_cond_signal(&buffIsNotFull);}return NULL;}//test signal sendervoid *ServerMonitor::sExcute(void *){#define TESTLEN 1000printf("\r\n sExcute \r\n");int i;for(i=0;i<=1000;i++){pthread_mutex_lock(&lock);   //保证lock和unlock中间数据段为互斥操作,加锁if((wAction+1)%size==rAction){pthread_cond_wait(&buffIsNotFull,&lock); //缓冲区未满,等待写端写入}dataBuff[wAction]=i;wAction++;if(wAction>=size){wAction=0;}printf("\r\n write the data is %d \r\n",i);pthread_mutex_unlock(&lock);    pthread_cond_signal(&buffIsNotEmpty);}return NULL;}int ServerMonitor::CreateThreadPool(int pTmp){int pMTet=-1,pETet=-1;pthread_mutex_init(&lock,NULL);pthread_cond_init(&buffIsNotEmpty,NULL);pthread_cond_init(&buffIsNotFull,NULL);pETet=pthread_create(&sServerMonitor->sPool[EXECUTE_THD].id,NULL,sExcute,NULL);pMTet=pthread_create(&sServerMonitor->sPool[MONITOR_THD].id,NULL,sMonitor,NULL);if(pMTet!=0||pETet!=0)  { printf("\r\n CreateThreadPool falied \r\n");return -1;}pthread_join(sServerMonitor->sPool[EXECUTE_THD].id,NULL);pthread_join(sServerMonitor->sPool[MONITOR_THD].id,NULL);}int main(){int initFlag=-1;memset(dataBuff,0,sizeof(dataBuff));ServerMonitor::GetInstance()->CreateThreadPool(pNumber);if(initFlag==-1) return -1;return 0;}
2. 上面所述为使用C++实现的线程间生产者,消费者模式代码,头文件大家可以自己写,主要是一个单例模式。



0 0
原创粉丝点击