c语言实现生产消费跨线程用例
时间: 2023-03-04 11:53:23 浏览: 114
C语言使用多线程例子
下面是一个使用C语言实现生产者-消费者问题的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 5 // 缓冲区大小
#define NUM_ITEMS 20 // 生产和消费的总数
int buffer[BUFFER_SIZE]; // 缓冲区
int in = 0; // 下一个生产位置
int out = 0; // 下一个消费位置
sem_t empty, full; // 信号量
pthread_mutex_t mutex; // 互斥锁
void *producer(void *arg) {
int i;
for (i = 0; i < NUM_ITEMS; i++) {
sem_wait(&empty);
pthread_mutex_lock(&mutex);
buffer[in] = i;
printf("Producing %d...\n", buffer[in]);
in = (in + 1) % BUFFER_SIZE;
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
return NULL;
}
void *consumer(void *arg) {
int i, item;
for (i = 0; i < NUM_ITEMS; i++) {
sem_wait(&full);
pthread_mutex_lock(&mutex);
item = buffer[out];
printf("Consuming %d...\n", item);
out = (out + 1) % BUFFER_SIZE;
pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
return NULL;
}
int main() {
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);
pthread_t producer_thread, consumer_thread;
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
sem_destroy(&empty);
sem_destroy(&full);
pthread_mutex_destroy(&mutex);
return 0;
}
```
在这个例子中,生产者和消费者通过信号量和互斥锁实现同步。`sem_init`函数初始化信号量,`sem_wait`函数等待信号量减一,`sem_post`函数增加信号量。`pthread_mutex_init`函数初始化互斥锁,`pthread_mutex_lock`函数获得互斥锁,`pthread_mutex_unlock`函数释放互斥锁。
生产者将生产的项目放入缓冲区中,消费者从缓冲区中取出项目进行消费。当缓冲区满时,生产者需要等待,直到有一个空的位置可以存放新的项目。当缓冲区为空时,消费者需要等待,直到有一个项目可以被消费。通过使用信号量和互斥锁,这个例子中的生产者和消费者可以在不冲突的情况下同时运行。
阅读全文