blog原文地址:https://www.cnblogs.com/lijingcheng/p/4454876.html
代码下载地址:https://download.csdn.net/download/andylauren/10669667
所谓线程消息队列,就是一个普通的循环队列加上“多生产者-单(多)消费者的存/取操作”。流水线方式中的线程是单消费者,线程池方式中的线程是多消费者。
测试代码
#include "msg_queue.h"
#include "stdio.h"
struct msg_queue queue;
void *produce(void * arg)
{
pthread_detach(pthread_self());
int i = 0;
while(1){
struct msg_buffer *strmsg = (struct msg_buffer*)malloc(sizeof(struct msg_buffer));
strmsg->size = 10;
char *a = (char *)malloc(10);
sprintf(a, "produce%d", i++);
strmsg->buffer = a;
put_queue(&queue, strmsg);
printf("produce strmsg Data:%s\n", a);
usleep(100000);
if(i == 15)
break;
}
return NULL;
}
void *consume(void *arg)
{
char *data;
while(1){
struct msg_buffer *strmsg = get_queue(&queue);
data = (char *)(strmsg->buffer);
printf("consume strmsg Data:%s\n", data);
free(data);
usleep(400000);
}
}
int main()
{
pthread_t pid;
init_queue(&queue, "test", 10);
//pthread_create(&pid, 0, produce, 0);
//pthread_create(&pid, 0, produce, 0);
pthread_create(&pid, 0, produce, 0);
pthread_create(&pid, 0, consume, 0);
//pthread_create(&pid, 0, consume, 0);
//pthread_create(&pid, 0, consume, 0);
sleep(3);
destroy_queue(&queue);
}
编译测试
rt@ubuntu:~/msg_queue$ gcc msg_queue.c msg_test.c -o test -lpthread
msg_queue.c: In function ‘init_queue’:
msg_queue.c:17:28: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 2 has type ‘unsigned int’ [-Wformat=]
printf("msg_buffer size:%ld\n", sizeof(struct msg_buffer*));
~~^
%d
rt@ubuntu:~/msg_queue$ ls
msg_queue.c msg_queue.h msg_test.c test 新建文本文档.txt
rt@ubuntu:~/msg_queue$ ./test
msg_buffer size:4
produce strmsg Data:produce0
consume strmsg Data:produce0
produce strmsg Data:produce1
produce strmsg Data:produce2
produce strmsg Data:produce3
consume strmsg Data:produce1
produce strmsg Data:produce4
produce strmsg Data:produce5
produce strmsg Data:produce6
produce strmsg Data:produce7
consume strmsg Data:produce2
produce strmsg Data:produce8
produce strmsg Data:produce9
produce strmsg Data:produce10
produce strmsg Data:produce11
consume strmsg Data:produce3
produce strmsg Data:produce12
produce strmsg Data:produce13
consume strmsg Data:produce4
produce strmsg Data:produce14
consume strmsg Data:produce5
consume strmsg Data:produce6
consume strmsg Data:produce7