示例
基于互斥锁实现生产者与消费者模型
- 主线程为消费者
- n 个子线程作为生产者
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <pthread.h>
#include <unistd.h>
static int number = 0;//共享变量
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
void *thread_handler(void *arg)
{
int cnt = atoi((char *)arg);
int i,tmp;
for(i = 0;i < cnt;i++){
pthread_mutex_lock(&mtx);
printf("线程 [%ld] 生产一个产品,产品数量为:%d\n",pthread_self(),++number);
pthread_mutex_unlock(&mtx);
}
pthread_exit((void *)0);
}
int main(int argc,char *argv[])
{
pthread_t tid;
int i;
int err;
int total_of_produce = 0;//总的生产产品的数量
int total_of_consume = 0;//总的消费产品的数量
bool done = false;
for (i = 1;i < argc;i++){
total_of_produce += atoi(argv[i]); // 生产数量的总和
err = pthread_create(&tid,NULL,thread_handler,(void *)argv[i]);
if (err != 0)
{
perror("pthread_create()");
exit(EXIT_FAILURE);
}
}
for (;;){
pthread_mutex_lock(&mtx);
while(number > 0){
total_of_consume++; // 消费产品总数
printf("消费一个产品,产品数量为:%d\n",--number);
done = total_of_consume >= total_of_produce; // 判断消费者数量与产品数量
sleep(1);
}
pthread_mutex_unlock(&mtx);
if (done)
break;
}
return 0;
}
~
- 代码执行时的方式
./a.out 1 2 3 //表示3个线程,分别生产 1 个产品 2 个产品 3 个产品 总共6个产品
练习
实现生产者与消费者模型,并解决上述代码中线程资源的释放