效果如下图:
给大家解释一下上述效果:在左侧(顶格)的是生产者(Producer);在右侧(空格)的是消费者(Consumer)。生产者有1个,代号为“0”;消费者有2个,代号分别为“0”和“1”。
生产者首先生产出一个产品,输出“is producing Product”。然后唤醒消费者来消费,输出“is waking Consumer”。
消费者生成时会报告自己的信息,比如“I am Consumer 0”代表它是0号消费者。如果有东西可以消费,它会输出“Consumer 代号 consume product success!!!!”代表消费成功。
程序实现的效果是:生产者不断生产“产品”,然后消费者“0”和“1”不断进行消费,如此循环往复。
代码非常简单,如下:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#include <pthread.h>
#define CONSUMER_NUM 2
#define PRODUCER_NUM 1
pthread_t pids[CONSUMER_NUM+PRODUCER_NUM];
int ready = 0;
int running =1;
pthread_mutex_t mutex;
pthread_cond_t has_product;
void* producer(void* arg){
int no = (int)arg;
while(running){
pthread_mutex_lock(&mutex);
ready++;
printf("Producer %d is producing Product\n",no);
fflush(stdout);
pthread_cond_signal(&has_product);
printf("Producer %d is waking Consumer\n",no);
fflush(stdout);
pthread_mutex_unlock(&mutex);
sleep(1);
}
return NULL;
}
void* consumer(void* arg){
int num = (int)arg;
while(running){
pthread_mutex_lock(&mutex);
while(ready==0){
printf("\tConsumer %d is waiting...\n",num);
fflush(stdout);
pthread_cond_wait(&has_product,&mutex);
}
ready--;
printf("\tConsumer %d consume product success!!!!!\n",num);
fflush(stdout);
pthread_mutex_unlock(&mutex);
sleep(3);
}
return NULL;
}
void HxSyscall(int num){
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&has_product,NULL);
printf("init success!\n");
int i;
int thread_ids[CONSUMER_NUM + PRODUCER_NUM];
for(i=0; i<PRODUCER_NUM; i++){
thread_ids[i] = i;
pthread_create(&pids[i], NULL, producer, (void*)i);
}
for(i=0; i<CONSUMER_NUM; i++){
printf("\tI am Consumer %d \n",i);
fflush(stdout);
sleep(2);
thread_ids[PRODUCER_NUM + i] = i;
pthread_create(&pids[PRODUCER_NUM + i], NULL, consumer, (void*)i);
}
for(i=0; i<PRODUCER_NUM + CONSUMER_NUM; i++){
pthread_join(pids[i], NULL);
}
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&has_product);
return;
}
大家只需要按照project1的方式,将上述代码放入home/openharmony/kernel/liteos_a/syscall下的hx_syscall.c文件夹下即可(这里为了方便基础较薄弱的同学操作,所以我们仍旧采用勖哥在pro1中的函数命名),接下来大家只需要按照pro1的方式进行编译烧录即可运行。
【如果觉得有帮助记得点赞+收藏⭐】