Linux内核开发之并发控制(五)

"小涛,还有多少啊,你看我本来就开玩笑似的说说火车票,飞机票的事,看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内核开发之并发控制(五))