Linux函数原型实例分析
发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,本篇内容主要讲解"Linux函数原型实例分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Linux函数原型实例分析"吧!引言条件变量是利用线程间共享的全
千家信息网最后更新 2025年11月10日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安全错误
数据库的锁怎样保障安全
世界山茶属数据库
通信网络安全需求
校验服务器校验失败
自己设计简单进销存数据库
交通行业网络安全工作方案报价
nginx vue 数据库
安卓手机怎么连接pc服务器
rds数据库慢
网络安全法第七十二条该如何理解
苏州前端软件开发服务费
清空表里面的数据库
观致7大屏显示无法连接到服务器
自己创建的数据库账号密码是什么
国开2021秋季数据库应用技术
数据库中怎么查询不等于
攻击别人的服务器
400g数据库
扬州网络安全准入控制系统供应商
医院护理网络安全应急预案
冒险岛2最多人服务器
软件开发商业模式怎么能赚钱
dhcp服务器租期
湖南网络技术培训班
山西大型软件开发销售公司
芜湖笔记本网络技术
网络安全法的前世今生
更改数据库中字段为自增
天正 是用什么软件开发的
去哪儿网强大的数据库技术
r语言数据库字符替换