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
- linux下线程通过signal通信实例
- Linux下的C语言编程——进程间通过signal函数通信简单操作
- Linux 下进程间通信机制(三) 信号Signal
- Linux下线程间通信
- linux 下的通信实例
- Linux下pipe通信实例
- linux 进程通信---信号signal
- Linux下Signal信号
- Linux下Signal信号
- Linux下Signal信号
- Linux下Signal信号
- linux下signal函数
- Linux 下 signal 机制
- Linux下Signal信号
- Linux下信号signal
- Linux下Signal信号
- Linux 下signal 解析
- Linux下signal()使用
- 蓝桥杯-串的处理
- <JAVA练习>02——函数(打印九九乘法表)
- java 去掉html标签 使用正则表达式删除HTML标签。
- IAR中创建BLE/Zigbee新项目
- [BZOJ4004][JLOI2015]装备购买(贪心+高斯消元求线性基)
- linux下线程通过signal通信实例
- Base64编码简介
- ubuntu设置静态ip
- 单元测试-必要性
- web service开发时,wsdl2java 客户端代码的生成
- My97DatePicker日期插件
- android之ScrollView里嵌套ListView
- IEnumerable<T>类型直接转换成DataTable
- 怎样打开以及编辑PDF格式文件