通过消息队列实现线程间通讯

来源:互联网 发布:雅思口语网络课程 编辑:程序博客网 时间: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);}

可以看出来,实现还是很简单的。