"小涛,还有多少啊,你看我本来就开玩笑似的说说火车票,飞机票的事,看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了,有我这几招,看谁还敢竞争,我也不用愁了,总算在这一集讲完了本不该讲完的东西..
如果有需要,我会给大家讲一节有关载入了并发控制的字符设备驱动程序,名字我都想好了---需要的请举手,火热招标中哈..
不好意思,人在江湖走,怎能不湿脚,不小心做起广告来了…