线程消息队列代码

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

猜你喜欢

转载自blog.csdn.net/andylauren/article/details/82728294
今日推荐