Linux内核开发之并发控制(五)
来源:互联网 发布:linux如何嗅探欺骗 编辑:程序博客网 时间:2024/05/18 03:06
"小涛,还有多少啊,你看我本来就开玩笑似的说说火车票,飞机票的事,看MM的事,你在眉飞色舞,鸡飞狗跳的没完了呢…”
"啊?怎么这样呢,本来一个寝室,做人的差别就那么大嗫,平时不好好学习,有问题了问我,给你免费教学,还满腹牢骚,也太不够朋友了吧…."我锤着桌子说.
"朋友,我还不够朋友啊,你没听说吗:朋友为我,两肋插刀,我为朋友,插它两刀..“小王打断我,”听你念经似的,都三个小时了,你瞧,都来五了,怎么,你还想和老易的品三国pk一下谁的剧集..“
想想我也无语了,太阳起了又落,落了又起;花儿也不知开了几次,都懒得理我了,我也寻思这个并发控制为啥就讲不完呢..后面还有精彩的没说呢,不能在这里就把小王的劲头给扼杀了…”好了,你也别唧唧歪歪,嘟嘟伦伦了,我发誓,对灯发誓,如果这节还讲不完,你GF的事,我给你解决了,还不行吗”我是无奈了。
“这感情好..”一听到MM的话题,小王总是有说不完的激情,没办法,做人的差距还就是那么大.
言归正传,话说...
出招表十:读写信号量(不是吧,都十了,怪不得小王不耐烦了,这么多招式,相当年,我有九阳神功护体还没这么快呢..哎)
“小王,你记得不,我在前边提到过一招,说的是:防写不防读…“
"记得,有MM,我就记得,没有那就好说了..“
“得得,不问你了,三句不离XXX”
传说中:读写信号量可允许N个读执行单元同时访问共享资源,而最多只能有一个写执行单元。
“我想起来了,想起来了,就是和前边的那个什么----防出不防进…..差不多…”想想小王那副口水哈子吊多长的样子,我都懒的理他了..
使用方法:1)定义和初始化读写信号量
struct rw_semphore my_rws; //定义读写信号量
void init_rwsem(struct rw_semaphore *sem); //初始化读写信号量
2)读信号量获取
void down_read(struct rw_semaphore *sem);
int down_read_try(struct rw_semaphore *sem);
3)读信号量释放
void up_read(struct rw_semaphore *sem);
4)写信号量获取
void down_write(struct rw_semaphore *sem);
int down_write_try(struct rw_semaphore *sem);
5)写信号量释放
void up_write(struct rw_semaphore *sem);
给个例子吧:
rw_semaphore rw_sem;//定义读写信号量init_rwsem(&rw_sem);//初始化读写信号量//读时获取信号量down_read(&rw_sem);...//临界资源up_read(&rw_sem);//写时获取信号量down_write(&rw_sem);...//临界资源up_write(&rw_sem);
说句真的,如果小王赖上我给他找个MM,我还心里真没底,所以吗,下面说最最最最后一招,我也就解放了哦…
出招表十一:互斥体(啥叫互斥体,怎么感觉前边的都是互斥体,呵呵,确实,只不过Linux开发者们觉得不过瘾,就专门研究了一个互斥体,谁让咱用人家的东西呢)
使用方法:1)定义并初始化互斥体
struct mutex my_mutex;
mutex_init(&my_mutex);
2)获取互斥体
void fastcall mutex_lock(struct mutex *lock);//引起的睡眠不能被打断
int fastcall mutex_lock_interruptible(struct mutex *lock);//可以被打断
int fastcall mutex_lock_trylock(struct mutex *lock);//尝试获得,获取不到也不会导致进程休眠
3)释放互斥体
void fastcall mutex_unlock(struct mutex *lock);
给个例子:
struct mutex my_mutex; //定义mutex
mutex_init(&my_mutex);
mutex_lock(&my_mutex);
….//临界资源
mutex_unlock(&my_mutex);
完了,一切都完了,有关并发控制的相关招数都完了,小王也该放心去追MM了,有我这几招,看谁还敢竞争,我也不用愁了,总算在这一集讲完了本不该讲完的东西..
如果有需要,我会给大家讲一节有关载入了并发控制的字符设备驱动程序,名字我都想好了---需要的请举手,火热招标中哈..
不好意思,人在江湖走,怎能不湿脚,不小心做起广告来了…
- Linux内核开发之并发控制(五)
- Linux内核开发之并发控制(五)
- Linux内核开发之并发控制(五)
- linux内核开发之并发控制(五)
- Linux内核开发之并发控制(一)
- Linux内核开发之并发控制(二)
- Linux内核开发之并发控制(三)
- Linux内核开发之并发控制(四)
- Linux内核开发之并发控制(一)
- Linux内核开发之并发控制(二)
- Linux内核开发之并发控制(三)
- Linux内核开发之并发控制(四)
- Linux内核开发之并发控制(一)
- Linux内核开发之并发控制(二)
- Linux内核开发之并发控制(三)
- Linux内核开发之并发控制(四)
- Linux内核开发之并发控制(实例总结篇)
- Linux内核开发之并发控制(实例总结篇)
- CRSD进程在11g中的变化
- 整数划分问题
- Oracle11g 系列产品的卸载
- iOS - Xcode升级到5.1& iOS升级到iOS7.1问题:Undefined symbols for architecture x86_64
- OCP 1Z0 051 QUESTION NO: 58
- Linux内核开发之并发控制(五)
- iOS开发百问(4)
- FreeBSD10安装CodeBlocks13.12
- 5个步骤,将 storyboard 从 iphone 版转变为 ipad 版
- libGdx地图编辑api
- Managing the Redo Log-6.1、What Is the Redo Log?
- 有趣的 Scala 语言: 简洁的 Scala 语法
- 打败 IE 的葵花宝典:CSS Bug Table
- 【破“校园网一人一号”】锐捷4.96破解+wifi共享精灵