linux下线程条件变量生产者消费者
时间: 2023-10-23 16:18:14 浏览: 96
create_a_thread_under_linux.zip_linux create thre_linux create t
下面是一个简单的生产者消费者模型的示例代码,使用了线程和条件变量:
```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_cond_t not_full;
pthread_cond_t not_empty;
void *producer(void *arg) {
int item = 0;
while (1) {
item = rand() % 100 + 1; // 产生一个随机数
pthread_mutex_lock(&mutex);
while (count == BUFFER_SIZE) {
pthread_cond_wait(¬_full, &mutex); // 缓冲区已满,等待消费者消费
}
buffer[in] = item;
printf("Producer produced item %d, buffer[%d]\n", item, in);
in = (in + 1) % BUFFER_SIZE;
count++;
pthread_mutex_unlock(&mutex);
pthread_cond_signal(¬_empty); // 唤醒等待消费的线程
sleep(1);
}
return NULL;
}
void *consumer(void *arg) {
int item = 0;
while (1) {
pthread_mutex_lock(&mutex);
while (count == 0) {
pthread_cond_wait(¬_empty, &mutex); // 缓冲区为空,等待生产者生产
}
item = buffer[out];
printf("Consumer consumed item %d, buffer[%d]\n", item, out);
out = (out + 1) % BUFFER_SIZE;
count--;
pthread_mutex_unlock(&mutex);
pthread_cond_signal(¬_full); // 唤醒等待生产的线程
sleep(1);
}
return NULL;
}
int main() {
pthread_t tid_producer, tid_consumer;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(¬_full, NULL);
pthread_cond_init(¬_empty, NULL);
pthread_create(&tid_producer, NULL, producer, NULL);
pthread_create(&tid_consumer, NULL, consumer, NULL);
pthread_join(tid_producer, NULL);
pthread_join(tid_consumer, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(¬_full);
pthread_cond_destroy(¬_empty);
return 0;
}
```
在这个示例中,缓冲区是一个循环队列,使用变量 `count` 记录缓冲区中的元素个数,使用变量 `in` 和 `out` 分别记录下一个生产者放入元素的位置和下一个消费者取出元素的位置。
生产者线程不断产生随机数,并将其放入缓冲区中。如果缓冲区已满,则线程进入等待状态,等待消费者线程取出元素后唤醒。当生产者放入元素后,唤醒等待消费的线程。
消费者线程不断从缓冲区中取出元素,并打印出来。如果缓冲区为空,则线程进入等待状态,等待生产者线程放入元素后唤醒。当消费者取出元素后,唤醒等待生产的线程。
需要注意的是,在使用条件变量时,线程必须先获得互斥锁才能等待条件变量,否则会出现竞态条件。当线程等待条件变量时,会自动释放互斥锁,等待条件变量时也是需要判断条件的,如果条件不符合,则线程会继续等待,直到条件符合才会被唤醒。
阅读全文