生产者消费者多线程c语言
时间: 2023-09-05 17:14:28 浏览: 104
c#多线程之生产者消费者
生产者消费者问题是一个经典的多线程同步问题,可以使用信号量来解决。以下是一个简单的 C 语言实现:
```c
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 5
#define PRODUCER_NUM 2
#define CONSUMER_NUM 2
sem_t empty, full;
pthread_mutex_t mutex;
int buffer[BUFFER_SIZE];
int in = 0, out = 0;
void *producer(void *arg) {
int id = *(int *)arg;
while (1) {
int item = rand() % 1000;
sem_wait(&empty);
pthread_mutex_lock(&mutex);
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
printf("Producer %d produced item %d\n", id, item);
pthread_mutex_unlock(&mutex);
sem_post(&full);
sleep(rand() % 3);
}
}
void *consumer(void *arg) {
int id = *(int *)arg;
while (1) {
sem_wait(&full);
pthread_mutex_lock(&mutex);
int item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
printf("Consumer %d consumed item %d\n", id, item);
pthread_mutex_unlock(&mutex);
sem_post(&empty);
sleep(rand() % 3);
}
}
int main() {
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);
pthread_t tid[PRODUCER_NUM + CONSUMER_NUM];
int id[PRODUCER_NUM + CONSUMER_NUM];
for (int i = 0; i < PRODUCER_NUM; i++) {
id[i] = i;
pthread_create(&tid[i], NULL, producer, &id[i]);
}
for (int i = 0; i < CONSUMER_NUM; i++) {
id[PRODUCER_NUM + i] = i;
pthread_create(&tid[PRODUCER_NUM + i], NULL, consumer, &id[PRODUCER_NUM + i]);
}
for (int i = 0; i < PRODUCER_NUM + CONSUMER_NUM; i++) {
pthread_join(tid[i], NULL);
}
pthread_mutex_destroy(&mutex);
sem_destroy(&full);
sem_destroy(&empty);
return 0;
}
```
在程序中,我们使用了两个信号量 `empty` 和 `full` 分别表示空闲缓冲区的数量和已占用缓冲区的数量。对于生产者线程,每当一个新的 item 被生产出来,需要先等待 `empty` 信号量,表示有空闲的缓冲区可以使用。然后获取互斥锁,将 item 放入缓冲区中,更新 `in` 指针,表示下一个可用的缓冲区。最后释放互斥锁,增加 `full` 信号量,表示已占用的缓冲区数量加 1。
对于消费者线程,每当需要消费一个 item,需要先等待 `full` 信号量,表示有已占用的缓冲区可以使用。然后获取互斥锁,从缓冲区中取出 item,更新 `out` 指针,表示下一个可用的缓冲区。最后释放互斥锁,增加 `empty` 信号量,表示空闲的缓冲区数量加 1。
最后,我们创建多个生产者线程和消费者线程,并等待所有线程结束。注意需要在程序结束时销毁互斥锁和信号量。
阅读全文