C 语言多线程中消费者生产者模式怎么实现? |
您所在的位置:网站首页 › 多线程怎么debug › C 语言多线程中消费者生产者模式怎么实现? |
在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 |