Linux函数原型实例分析
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"Linux函数原型实例分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Linux函数原型实例分析"吧!引言条件变量是利用线程间共享的全
千家信息网最后更新 2026年11月02日Linux函数原型实例分析
本篇内容主要讲解"Linux函数原型实例分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Linux函数原型实例分析"吧!
引言
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待条件变量的条件成立而挂起(此时不再占用cpu);另一个线程使条件成立(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。
函数原型
1. 定义条件变量
#include/* 定义两个条件变量 */pthread_cond_t cond_pro, cond_con;
2. 初始化和销毁条件变量
#includeint pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);int pthread_cond_destroy(pthread_cond_t *cond); /* 初始化条件变量 */pthread_cond_init(&cond_pro, null);pthread_cond_init(&cond_con, null);/* 销毁条件变量 */pthread_cond_destroy(&cond_pro);pthread_cond_destroy(&cond_pro);
3. 等待和激发条件
#includeint pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);int pthread_cond_broadcast(pthread_cond_t *cond);int pthread_cond_signal(pthread_cond_t *cond);/* 等待条件 *//* 注意:pthread_cond_wait为阻塞函数。解开锁,再等待。等条件满足时,需要抢到锁,才可以被唤醒*/ pthread_cond_wait(&cond_pro,&mutex); /* 激发条件 *//* 所有因为不满足条件的线程都会阻塞在条件变量cond_pro中的一个队列中 *//* 以广播方式,通知所有被阻塞的所有线程 */pthread_cond_broadcast(&cond_pro);/* 以signal方式,只通知排在最前面的线程 */pthread_cond_signal(&cond_pro);
代码
/************************************************************************* > file name: my_con.c > author: krischou > mail:zhoujx0219@163.com > created time: tue 26 aug 2014 10:24:29 am cst ************************************************************************/#include#include #include #include #include #define cell 10#define flore 0 int i = 0; /* 所有线程共享的全局变量,此处假定至多递增至10,最小减到0 */pthread_mutex_t mutex; /* 定义互斥锁 */pthread_cond_t cond_pro, cond_con; /* 定义两个条件变量 *//* 生产者线程 */void* pro_handler(void *arg){ pthread_detach(pthread_self()); /* 由系统回收线程资源,而非主线程回收资源 ,此类情况主线程是个服务器,永久不会退出 */ while(1) { pthread_mutex_lock(&mutex); while(i >= cell) { pthread_cond_wait(&cond_pro,&mutex); /* continue是轮询,此处是阻塞 */ /* 把锁放开再等 ,第一个参数是结构体指针,其中有成员存放被阻塞的函数 */ /*不占cpu*/ /* 不满足条件时才会等 ,需要别人告诉它,才能唤醒它*//* 当它返回时,锁也要回来了*/ } i++; if(i == 1) { /* 由空到不空,唤醒消费者 */ pthread_cond_signal(&cond_con); /*不会立马signal被阻塞的消费者线程,因为其还要等锁抢回来*/ } printf("add i: %d \n", i); pthread_mutex_unlock(&mutex); sleep(rand() % 5 + 1); }}/* 消费者线程 */void* con_handler(void *arg){ pthread_detach(pthread_self()); while(1) { pthread_mutex_lock(&mutex); while(i <= flore) { pthread_cond_wait(&cond_cno,&mutex); } i--; if(i == 9) /* 由满到不满,要告诉生产者,以便将其唤醒 *//*此处,直接signal也可以,我们是为了更加精确*/ { pthread_cond_signal(&cond_pro); } printf("con i: %d \n", i); pthread_mutex_unlock(&mutex); sleep(rand() % 5 + 1); }}int main(int argc, char *argv[]) // exe +num -num{ srand(getpid()); int con_cnt, pro_cnt; pro_cnt = atoi(argv[1]); con_cnt = atoi(argv[2]); pthread_mutex_init(&mutex,null); pthread_cond_init(&cond_pro,null); pthread_cond_init(&cond_con,null); pthread_t *arr = (pthread_t*)calloc(con_cnt + pro_cnt , sizeof(pthread_t)); int index = 0; while(pro_cnt > 0) { pthread_create(arr + index, null, pro_handler, null); index++; pro_cnt--; } while(con_cnt > 0) { pthread_create(arr + index, null, con_handler, null); index++; con_cnt--; } while(1); pthread_mutex_destroy(&mutex); pthread_cond_destroy(&cond_pro); pthread_cond_destroy(&cond_con); return 0;}
注意
无论是在生产者线程,还是在消费者线程中。标记黄色部分的判断条件必须用while。以生产者线程举例,当i>=cell时,也就是i满时,此时执行pthread_cond_wait(&cond_cno,&mutex); 该生产者线程被挂起。必须等到消费者线程pthread_cond_signal(&cond_pro); 将其唤醒。但是消费者将其signal还不够,被挂其的生产者线程必须重新拿到锁,才可以被激活。但是,由于在消费者signal的同时,生产者并不能立即抢到锁,所以此时可能i值又改变变为大于等于10了。因此必须用while。不然可能导致i>10。
到此,相信大家对"Linux函数原型实例分析"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
条件
线程
变量
消费者
消费
函数
生产者
生产
阻塞
原型
实例
实例分析
分析
两个
全局
内容
方式
资源
学习
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
为想互联网科技怎么样
科技和互联网公司
互联网巨头科技公司
互联网科技的
互联网科技英文
礼当家互联网科技
互联网与新科技
杭州互联网科技公司
鑫亿盛互联网科技
科技大学互联网专业好不好
北京华百购互联网科技有限公司
湖北码尼互联网科技有限公司电话
崇明区互联网教育科技售后服务
广州市恰铎互联网科技有限公司
玉溪新华互联网科技好不好
工业互联网山东科技大学
锡山区互联网智能科技产品供应
宇信科技在杭州互联网排第几
抖集互联网科技技术咨询
高科技和互联网的现代国家
广州淘业互联网络科技
喔噻互联网科技
互联网科技logo设计
互联网前沿科技
互联网科技公司名称
广西拼得多互联网科技有限公司
千方科技属于互联网企业吗
徐州市互联网科技有限公司
济南小医互联网科技有限公司招聘
安徽九吞吴互联网科技有限公司