【HarmonyOS NEXT应用开发】案例32:ArkTS多线程的多线程系列(四):基于生产者-消费者实现多线程协同

日志记录、埋点是较为常见的生产者-消费者模式使用场景,应用的主线程以及其他业务子线程作为生产者,在需要的时候向共享队列中插入日志或者埋点数据,消费者子线程则会从队列中将日志或者埋点信息取出,并进行相关业务处理,比如落盘、上云等。这样所有的日志、埋点处理均在子线程中完成,不占用主线程执行时间。并且业务独立,可以通过独立的团队进行开发,其他业务团队只需要向队列中插入数据即可。

cke_47130.gif

生产者-消费者模式简介

生产者-消费者模式是一种经典的多线程设计模式,它为多线程间的协同提供了良好的解决方案。

在生产者-消费者模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费线程负责具体处理生产者提交的任务。生产者和消费者直接则通过共享内存缓冲区进行通信。

以下是一个基本的生产者-消费者模型的多线程实现,使用了互斥锁和条件变量: ```c #include <stdlib.h> #include <stdio.h> #include <pthread.h> #define BUFFER_SIZE 10 typedef struct item_t { int value; struct item_t *next; } item_t; item_t *buffer = NULL; pthread_mutex_t buffer_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t buffer_not_full = PTHREAD_COND_INITIALIZER; pthread_cond_t buffer_not_empty = PTHREAD_COND_INITIALIZER; void *producer(void *arg) { int i; for (i = 0; i < BUFFER_SIZE * 2; i++) { item_t *item = malloc(sizeof(item_t)); item->value = i; pthread_mutex_lock(&buffer_mutex); while (buffer != NULL && i % BUFFER_SIZE == 0) { pthread_cond_wait(&buffer_not_full, &buffer_mutex); } item->next = buffer; buffer = item; pthread_cond_signal(&buffer_not_empty); pthread_mutex_unlock(&buffer_mutex); } pthread_exit(NULL); } void *consumer(void *arg) { int i; for (i = 0; i < BUFFER_SIZE * 2; i++) { pthread_mutex_lock(&buffer_mutex); while (buffer == NULL) { pthread_cond_wait(&buffer_not_empty, &buffer_mutex); } item_t *item = buffer; buffer = item->next; pthread_cond_signal(&buffer_not_full); pthread_mutex_unlock(&buffer_mutex); printf("Consuming item with value %d...\n", item->value); free(item); } pthread_exit(NULL); } int main() { pthread_t producer_thread, consumer_thread; pthread_create(&producer_thread, NULL, producer, NULL); pthread_create(&consumer_thread, NULL, consumer, NULL); pthread_join(producer_thread, NULL); pthread_join(consumer_thread, NULL); return 0; } ``` 在主函数中,我们创建了一个生产者线程和一个消费者线程。生产者线程循环生产一些项目,并将它们添加到缓冲区的开头。如果缓冲区已满,生产者会等待条件变量 `buffer_not_full`。一旦生产者添加了一个项目,它就会发出信号,通知消费者可以开始消费项目了。 消费者线程循环等待缓冲区中是否有项目可供消费。如果没有,它会等待条件变量 `buffer_not_empty`。一旦消费者开始消费项目,它会从缓冲区的头部删除项目,并发出信号,通知生产者可以继续生产新的项目。 需要注意的是,我们使用互斥锁来保护缓冲区的访问,以避免竞争条件。我们还使用条件变量来让线程在等待时休眠,并在等待的条件满足时被唤醒。这种方法比轮询缓冲区状态要更有效率,因为它可以让线程在等待时释放 CPU 时间片。 这只是一个基本的实现,你可以根据实际需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青少年编程作品集

你的赞赏将带来极佳的运气和才气

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值