Linux函数原型实例分析
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本篇内容主要讲解"Linux函数原型实例分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Linux函数原型实例分析"吧!引言条件变量是利用线程间共享的全
千家信息网最后更新 2025年01月19日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安全错误
数据库的锁怎样保障安全
高新区推广网络技术怎么样
软件开发客户定位
株洲网络安全执法案例
服务器显示器驱动安装
jet数据库找不到
2022学校网络安全自查总结
计算机二级科目数据库
java如何连接数据库用什么软件
软件开发跟编程有什么区别
网络安全法 规定 各级人民
为什么cf连接服务器失败
国内网络安全公司哪个待遇好
5280m5服务器参数
与生活相关软件开发需求
5g网络技术主要分为
怀旧服寒冰之王战场服务器分组
公司服务器如何升级
和县网络安全
国家安全网络安全演讲比赛
校园防诈骗网络安全教育
全年龄网络安全指南
电信租服务器
网络安全海报背景图
bs架构软件开发工具
手机java数据库优化
高鸿股份 网络安全
数据库系统类型有哪些类型
迈净互联网科技有限公司
传奇私服数据库连接断开
软件开发励志语录