C 语言多线程中消费者生产者模式怎么实现?

您所在的位置:网站首页 多线程怎么debug C 语言多线程中消费者生产者模式怎么实现?

C 语言多线程中消费者生产者模式怎么实现?

2023-03-29 06:33| 来源: 网络整理| 查看: 265

在C语言中,可以通过使用线程和互斥锁来实现消费者生产者模式。下面是一个简单的示例程序:

#include

#include

#define BUFFER_SIZE 10

int buffer[BUFFER_SIZE];

int index_in = 0;

int index_out = 0;

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_t full = PTHREAD_COND_INITIALIZER;

pthread_cond_t empty = PTHREAD_COND_INITIALIZER;

void *producer(void *arg) {

int i;

for (i = 0; i < 100; i++) {

pthread_mutex_lock(&lock);

while ((index_in + 1) % BUFFER_SIZE == index_out) {

pthread_cond_wait(&full, &lock);

}

buffer[index_in] = i;

index_in = (index_in + 1) % BUFFER_SIZE;

pthread_cond_signal(&empty);

pthread_mutex_unlock(&lock);

}

return NULL;

}

void *consumer(void *arg) {

int i, value;

for (i = 0; i < 100; i++) {

pthread_mutex_lock(&lock);

while (index_in == index_out) {

pthread_cond_wait(&empty, &lock);

}

value = buffer[index_out];

index_out = (index_out + 1) % BUFFER_SIZE;

pthread_cond_signal(&full);

pthread_mutex_unlock(&lock);

printf("Consumer: %d\n", value);

}

return NULL;

}

int main() {

pthread_t prod_thread, cons_thread;

pthread_create(&prod_thread, NULL, producer, NULL);

pthread_create(&cons_thread, NULL, consumer, NULL);

pthread_join(prod_thread, NULL);

pthread_join(cons_thread, NULL);

return 0;

}

在上面的示例中,定义了一个大小为10的缓冲区,两个指针index_in和index_out分别指向缓冲区的写和读位置。生产者线程向缓冲区写入数据,消费者线程从缓冲区读取数据。使用互斥锁lock保证对缓冲区的访问不会出现竞争条件,使用条件变量full和empty来通知线程缓冲区的状态。

在生产者线程中,首先获取互斥锁lock,然后检查缓冲区是否已满,如果已满,则等待缓冲区有空余空间。如果有空余空间,则向缓冲区写入数据,更新index_in指针,通知消费者线程有数据可读,并释放互斥锁lock。

在消费者线程中,首先获取互斥锁lock,然后检查缓冲区是否为空,如果为空,则等待缓冲区有数据可读。如果有数据可读,则从缓冲区读取数据,更新index_out指针,通知生产者线程有空余空间可写,并释放互斥锁lock。

最后,在主函数中创建生产者线程和消费者线程,并等待它们结束。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3