通过消息队列实现线程间通讯
来源:互联网 发布:雅思口语网络课程 编辑:程序博客网 时间:2024/05/20 20:18
之前一直在做单线程的工作,最近上位模块变动,需要通过一个小模块来封装已有的接口,来实现与新的上位模块间的通讯。
于是做了一项调查,如何实现线程间通讯。
最终选定了消息队列来实现这个需求:
用到的接口如下:
mq_open : 打开一个消息队列
mq_close : 关闭一个消息队列
mq_unlink : 删除一个消息队列
mq_receive : 接收消息
mq_send : 发送消息
实现上很简单,一个主线程创建一个消息队列,子线程接收消息,代码如下:
/* example.c*/#include <stdio.h>#include <pthread.h>#include <mqueue.h>#include <unistd.h>#include <errno.h>#define MAX_SIZE1024#define msg_stop"exit"#define QUEUE_NAME"/thread_mq"//#define QUEUE_NAME"/home/cyw/tools/thread_mq"void thread(void){mqd_t mq;ssize_t size;char buffer[MAX_SIZE];int count;count = 0;mq = mq_open (QUEUE_NAME, O_RDONLY); //O_RDWR | O_CREAT );if ((mqd_t) -1 == mq){printf("open error!\n");mq_close (mq);return;}while(0 < mq_receive (mq, buffer, MAX_SIZE,NULL)){printf("the %d's msg!\n", count++);}mq_close (mq);}int main(void){ pthread_t id; int i,ret;char buffer[MAX_SIZE];mqd_t mq;struct mq_attr attr;attr.mq_flags = 0;attr.mq_maxmsg = 10;attr.mq_msgsize = MAX_SIZE;attr.mq_curmsgs = 0;mq_unlink (QUEUE_NAME);mq = mq_open (QUEUE_NAME, O_RDWR | O_CREAT, 0644, &attr);if ((mqd_t) -1 == mq){printf("open error!\n");mq_close (mq);return;}memcpy(buffer, "name", 5); ret=pthread_create(&id,NULL,(void *) thread,NULL); if(ret!=0){ printf ("Create pthread error!\n"); //exit (1); }sleep(2);int m = 0;while (1){mq_send (mq, buffer, MAX_SIZE, 0);sleep(1);if (m > 5)break;m++;} pthread_join(id,NULL);mq_close (mq); return (0);}
可以看出来,实现还是很简单的。
- 通过消息队列实现线程间通讯
- 利用主线程与子线程间的消息通讯,实现任务处理队列
- 用线程和消息队列实现连个进程间的通讯
- 进程间通讯--消息队列
- 进程间通讯-消息队列
- 进程间通讯:消息队列
- Android -- 网络图片查看器,网络html查看器, 消息机制, 消息队列,线程间通讯
- 利用主线程与子线程间的消息通讯,实现任务处理队列.子线程中创建不会阻塞执行的窗口
- 利用线程消息队列,实现任务队列
- 进程间通讯--消息队列
- Linux进程间通讯之消息队列
- 进程间通讯--消息队列
- 进程间通讯--消息队列
- Linux进程间通讯之消息队列
- Linux进程间通讯之消息队列
- 进程间通讯之消息队列
- linux进程间通讯-消息队列
- Linux进程间通讯三--消息队列
- 统驭科目的集成修改
- Siege—最好的Linux下Web服务器性能/压力测试工具,Siege使用教程详细说明
- 谷歌技术"三宝"之MapReduce
- 两个月C++实习总结篇
- 超详细单机版搭建hadoop环境图文解析
- 通过消息队列实现线程间通讯
- C++ STL容器之 deque
- 谷歌技术"三宝"之谷歌文件系统
- Struts2从一个action转到另一个action的方法 以及reusult的type属性
- 位操作练习题
- Tomcat 7用注解方式实现invoker
- C++为什么没有base关键字
- android之Uri的常用几个例子
- Android中Context