所用的知识点和上章一样:https://blog.csdn.net/qq_40062917/article/details/80833194
理解生产者消费者的概念就好了,主要知识就是产品多了不让生产者生产,产品最少的时候不让消费者消费
代码如下
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>
#define CONSUMERS 6
#define PRODUCERS 4
#define MAX_PRODUCT 20
#define MIN_PRODUCT 0
int g_product_count = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_MUTEX_INITIALIZER;
void *consume_pthread(void *arg)
{
while (1)
{
pthread_mutex_lock(&mutex);
while (g_product_count == 0)
{
printf("The Product didn't\n");
//没有产品了 需要等待
pthread_cond_wait(&cond, &mutex);
}
printf("consume is %lu, g_count is %d\n", pthread_self(), g_product_count);
g_product_count--;
pthread_mutex_unlock(&mutex);
sleep(1);
}
pthread_exit(NULL);
}
void *produce_pthread(void *arg)
{
while (1)
{
pthread_mutex_lock(&mutex);
//注意这是 >= 因为产品生产在判断的下面
if (g_product_count >= MAX_PRODUCT)
{
printf("The product too much\n");
pthread_mutex_unlock(&mutex);
//由于生产的太多 这里做个延时 让消费者去消耗
sleep(1);
continue;
}
//进行生产 产品+1
g_product_count++;
printf("produce is %lu, g_product_count is %d\n", pthread_self(), g_product_count);
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);
//可以调节这里看到的现象不同
sleep(1);
}
//退出生产要做退出线程的操作
pthread_exit(NULL);
}
int main()
{
int i = 0;
pthread_t consumers[CONSUMERS];
pthread_t producers[PRODUCERS];
for (i = 0; i < CONSUMERS; i++)
{
// 不需要传递参数
pthread_create(&consumers[i], NULL, consume_pthread, NULL);
}
for (i = 0; i < PRODUCERS; i++)
{
// 不需要传递参数
pthread_create(&producers[i], NULL, produce_pthread, NULL);
}
for (i = 0; i < CONSUMERS; i++)
{
pthread_join(consumers[i], NULL);
}
for (i = 0; i < PRODUCERS; i++)
{
pthread_join(producers[i], NULL);
}
exit(0);
}
makfile如下:
TARGET=pthr
CC=gcc
RM=rm
cflag=-o
lflag= -lpthread -w
src = $(shell ls *.c)
put = $(patsubst %.c,%.o,$(src))
$(TARGET):$(put)
$(CC) $(cflag) $@ $(src) $(lflag)
clean:
$(RM) -rf $(TARGET) *.o
log如下:
The Product didn't
produce is 140448324687616, g_product_count is 1
produce is 140448324687616, g_product_count is 2
produce is 140448324687616, g_product_count is 3
produce is 140448324687616, g_product_count is 4
produce is 140448324687616, g_product_count is 5
produce is 140448324687616, g_product_count is 6
produce is 140448324687616, g_product_count is 7
produce is 140448324687616, g_product_count is 8
produce is 140448324687616, g_product_count is 9
produce is 140448324687616, g_product_count is 10
produce is 140448324687616, g_product_count is 11
produce is 140448324687616, g_product_count is 12
produce is 140448324687616, g_product_count is 13
produce is 140448324687616, g_product_count is 14
produce is 140448324687616, g_product_count is 15
produce is 140448324687616, g_product_count is 16
produce is 140448324687616, g_product_count is 17
produce is 140448324687616, g_product_count is 18
produce is 140448324687616, g_product_count is 19
produce is 140448324687616, g_product_count is 20
The product too much
The product too much
consume is 140448366651136, g_count is 20
consume is 140448358258432, g_count is 19
produce is 140448349865728, g_product_count is 19
produce is 140448349865728, g_product_count is 20
The product too much
consume is 140448391829248, g_count is 20
consume is 140448400221952, g_count is 19
consume is 140448375043840, g_count is 18
consume is 140448383436544, g_count is 17
produce is 140448333080320, g_product_count is 17
produce is 140448333080320, g_product_count is 18
produce is 140448333080320, g_product_count is 19
produce is 140448333080320, g_product_count is 20
The product too much
The product too much
The product too much