2026/5/19 3:39:06
网站建设
项目流程
东莞型网站建设,南磨房网站建设公司,自己怎么做新闻开头视频网站,做网站注册几类商标各类资料学习下载合集 链接:https://pan.quark.cn/s/b0a2f36933de
在前面的学习中,我们掌握了生产者-消费者模型的理论基础和条件变量的核心功能。现在,是时候将理论付诸实践了!本文将通过一个约 70 行的完整 C 语言代码示例,逐行分析如何使用链表、互斥锁和条件变量,构…各类资料学习下载合集链接:https://pan.quark.cn/s/b0a2f36933de在前面的学习中,我们掌握了生产者-消费者模型的理论基础和条件变量的核心功能。现在,是时候将理论付诸实践了!本文将通过一个约 70 行的完整 C 语言代码示例,逐行分析如何使用链表、互斥锁和条件变量,构建一个健壮的生产者-消费者模型。一、 蓝图设计:共享数据与同步机制在动手写代码之前,我们先规划好模型的“骨架”。1. 共享数据结构我们将使用一个链表来模拟可以无限增长的“公共区”(缓冲区)。// 链表节点,代表一个“产品”structmsg{intnum;structmsg*next;};// 全局头指针,指向链表的第一个产品structmsg*head=NULL;2. 同步机制我们需要两种工具来保证线程安全和同步:互斥锁 (Mutex):保护对全局头指针head的访问,确保链表操作的原子性。条件变量 (Condition Variable):用于线程间的通信,当链表为空时,通知消费者“等待”;当新产品加入时,通知消费者“开工”。我们将使用静态初始化的方式来定义它们,这种方式代码简洁,适用于全局变量。// 静态初始化互斥锁pthread_mutex_tlock=PTHREAD_MUTEX_INITIALIZER;// 静态初始化条件变量,代表“有产品”这个条件pthread_cond_thas_product=PTHREAD_COND_INITIALIZER;二、 消费者函数 (consumer) 深度分析消费者的任务是:当有产品时,从链表中取出并消费;没有产品时,则等待。void*consumer(void*arg){structmsg*mp;while(1){// 1. 加锁,准备访问共享链表pthread_mutex_lock(lock);// 2. 核心:使用 while 循环检查条件while(head==NULL){printf("--- [消费者] 链表为空, 等待产品...\n");// 3. 等待条件满足// 该函数会原子性地:①解锁lock ②阻塞线程 ③被唤醒后重新加锁lockpthread_cond_wait(has_product,lock);}// 4. 条件满足,消费数据(代码执行到这里,必然持有锁)mp=head;head=mp-next;// 摘除头节点printf("=== [消费者] 消费数据: %d\n",mp-num);// 5. 解锁,让其他线程可以访问链表pthread_mutex_unlock(lock