生产者消费者c语言线程
时间: 2023-11-07 12:43:38 浏览: 45
在 C 语言中,通过线程能够实现生产者-消费者模式。生产者负责向缓冲区中生产数据,消费者则负责从缓冲区中取出数据进行消费。为了避免生产者与消费者之间的竞争,需要利用互斥量来保护缓冲区的访问。同时,为了确保当缓冲区为空时消费者不会继续消费数据,需要用条件变量来实现消费者的等待和唤醒。具体的实现方法可以参考 Pthreads 线程库中的函数,如 pthread_mutex_lock()、pthread_mutex_unlock()、pthread_cond_wait()、pthread_cond_signal() 等。
相关问题
生产者消费者多线程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。
最后,我们创建多个生产者线程和消费者线程,并等待所有线程结束。注意需要在程序结束时销毁互斥锁和信号量。
生产者消费者问题c语言
生产者消费者问题是一个经典的同步问题,需要通过互斥、信号量等机制来实现线程之间的协作。以下是一个简单的使用互斥锁和条件变量实现的生产者消费者问题的C语言代码示例:
```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 empty = PTHREAD_COND_INITIALIZER;
pthread_cond_t full = PTHREAD_COND_INITIALIZER;
void *producer(void *arg) {
int i;
for (i = 0; i < 20; i++) {
pthread_mutex_lock(&mutex);
while (count == BUFFER_SIZE) {
pthread_cond_wait(&empty, &mutex);
}
buffer[in] = i;
in = (in + 1) % BUFFER_SIZE;
count++;
printf("Producer: produced %d, count = %d\n", i, count);
pthread_cond_signal(&full);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void *consumer(void *arg) {
int i, item;
for (i = 0; i < 20; i++) {
pthread_mutex_lock(&mutex);
while (count == 0) {
pthread_cond_wait(&full, &mutex);
}
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
count--;
printf("Consumer: consumed %d, count = %d\n", item, count);
pthread_cond_signal(&empty);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
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);
return 0;
}
```
在这个示例中,生产者和消费者分别运行在不同的线程中。生产者往缓冲区中生产数据,消费者从缓冲区中消费数据。互斥锁和条件变量用来保证线程之间的同步和互斥。具体实现逻辑如下:
- 在生产者线程中,首先获取互斥锁。如果缓冲区已满,就等待条件empty被满足并释放互斥锁,否则就往缓冲区中插入数据,并更新计数器count和in指针。然后发送信号full,通知消费者线程可以消费数据了,最后释放互斥锁。
- 在消费者线程中,首先获取互斥锁。如果缓冲区为空,就等待条件full被满足并释放互斥锁,否则就从缓冲区中取出数据,并更新计数器count和out指针。然后发送信号empty,通知生产者线程可以继续生产数据了,最后释放互斥锁。
这样,就可以通过互斥锁和条件变量来实现生产者消费者问题的同步和互斥了。