进程同步与互斥生产者消费者c语言代码
时间: 2023-07-31 14:08:32 浏览: 105
以下是一个生产者消费者问题的简单解决方案,它使用互斥锁和条件变量来实现进程同步和互斥。
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int count = 0;
int in = 0;
int out = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t full = PTHREAD_COND_INITIALIZER;
pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
void *producer(void *arg)
{
int i;
int item;
for (i = 0; i < 20; i++) {
item = rand() % 100; // 产生一个随机数
pthread_mutex_lock(&mutex);
while (count == BUFFER_SIZE) {
pthread_cond_wait(&empty, &mutex);
}
buffer[in] = item;
printf("Producer produced %d\n", item);
in = (in + 1) % BUFFER_SIZE;
count++;
pthread_cond_signal(&full);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void *consumer(void *arg)
{
int i;
int item;
for (i = 0; i < 20; i++) {
pthread_mutex_lock(&mutex);
while (count == 0) {
pthread_cond_wait(&full, &mutex);
}
item = buffer[out];
printf("Consumer consumed %d\n", item);
out = (out + 1) % BUFFER_SIZE;
count--;
pthread_cond_signal(&empty);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main()
{
pthread_t producer_thread, consumer_thread;
srand(time(NULL)); // 用当前时间作为随机数种子
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;
}
```
在这个代码中,生产者线程和消费者线程都会一直循环,每次生产者产生一个随机数就放入缓冲区中,并且通知消费者线程,如果缓冲区满了就等待;每次消费者从缓冲区中取出一个随机数并且通知生产者线程,如果缓冲区为空就等待。
需要注意的是,互斥锁和条件变量的初始化是通过 `PTHREAD_MUTEX_INITIALIZER` 和 `PTHREAD_COND_INITIALIZER` 这两个宏定义来完成的。同时,在使用条件变量的时候,需要先获取互斥锁,然后再等待条件变量,等待时会自动释放互斥锁,等到条件满足时再重新获取互斥锁。在通知等待线程时,需要先获取互斥锁,然后再发送信号或广播,之后再释放互斥锁。
阅读全文