#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <string.h>
// 定义结构体变量
struct _data
{
char *buf[10];
sem_t full;
sem_t empty;
int count;
}data;
// 初始化互斥量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// 生产者工作函数
void *producer(void *v)
{
char *buf[] = {"苹果", "梨", "波罗蜜", "山竹"};
int len = sizeof(buf) / sizeof(buf[0]);
while(1)
{
usleep(100000*(rand()%10+1));
// 如果信号量的值为0,就等待
// 然后减1
// 初始化为10
sem_wait(&data.empty);
pthread_mutex_lock(&mutex);
data.buf[data.count] = buf[rand()%len];
data.count++;
pthread_mutex_unlock(&mutex);
sem_post(&data.full);
}
}
// 消费者
void *customer (void *v)
{
long num = (long)v;
while(1)
{
usleep(100000*(rand()%10+1));
// 如果信号量的值为0,就等待
// 然后减1
// 初始化为0
// 生产者生产后,该信号量加了1,此时消费者可以吃了
sem_wait(&data.full);
pthread_mutex_lock(&mutex);
int index = rand()%data.count;
printf ("%ld 消费者吃了一个 %s,剩余个数%d\n", num, data.buf[index], data.count-1);
data.count--;
char *tmp = data.buf[data.count];
data.buf[data.count] = data.buf[index];
data.buf[index] = tmp;
pthread_mutex_unlock(&mutex);
sem_post(&data.empty);
}
}
// 生产者与消费者
int main()
{
srand((unsigned int)time(NULL));
pthread_t thread;
long i;
for (i = 0; i < 4; i++)
{
pthread_create(&thread, NULL, customer, (void *)(i+1));
pthread_detach(thread);
}
for (i = 0; i < 4; i++)
{
pthread_create(&thread, NULL, producer, NULL);
pthread_detach(thread);
}
sem_init(&data.full, 0, 0);
sem_init(&data.empty, 0, 10);
pthread_exit(NULL);
return 0;
}
生产者与消费者2.0——互斥量
最新推荐文章于 2021-04-29 04:50:21 发布