C语言实现原子锁(二)

我经常在快餐厅吃饭,可以自己加饭的那种,店里有好些服务器专门负责收掉已就餐完毕的客人的餐具。但是由于客人离开座位去加饭,导致服务员误收餐具的情况。所以我每次去加饭前,都会把自己的眼镜放在菜碟旁边,表示我还需要继续用餐,你不要收走我的餐具_

[TOC]

锁与同步机制

其实上面的例子就是用来说明计算机程序中锁是什么东东的一个很好的例子。模块A和模块B在某一个时刻都需要操作数据C,那么他们必须要以一种正确的方式来操作C,才能保证C不会出问题;这里的模块A相当于餐厅就餐中的客人,而模块B可以看作服务员,数据C就相当于要收拾的餐具。要保证收盘子不会出问题,我们需要一种机制——同步机制D,放置眼镜这个事实,来使得客人和服务员正确的使用盘子,也就是正确的操作数据C[1]
  同步机制是计算机编程里一个概念我们说的“锁”,可以是这个同步机制的别称,也可以是实现同步机制的实体名称,比如读写锁和文件锁。除了这些带”锁“结尾的实体,还有比如互斥量,信号,信号量,描述符IO都可以实现这种机制。这里的概念有些混乱,我表达得也不是很好,请大家多体会一下实体和概念的定义,这里“锁 ”的两个定义,就像价值和价格一样

锁的本质

锁是同步机制的实现,其本质是状态机,只有状态机在正确的状态上才能操作数据,否则就等待。下面用我们要实现的原子锁模拟上锁与解锁的过程。模块A与模块B同时操作数据C,并使用原子锁D进行同步,设原子锁的状态机未锁定状态为0,已锁定状态为1,且初始状态为0,假设时序为模块A先通过操作锁发起操作数据C的请求。整个操作过程的时序用以下的表格表示[2]

时序 模块A操作 模块B操作 原子锁D状态 数据C所属
开始 nil nil 0 nil
A优先B改变D的状态 while(1){
/*it will run this code
and then break loop*/
if(D.stat==0) D.stat = 1;
if (D.stat==1) break;
}
do other something turn stat from 0 to 1 Critical state
A操作C,B等待A再次复位D的状态 do something to data C while(1){
/*it will always in loop
until D's stat turn from 1 to 0*/
if(D.stat==0) D.stat = 1;
if (D.stat==1) break;
}
1 model A
A复位D的状态,B将要退出循环 D.stat = 0 while(1){/*it will break loop*/} turn stat from 1 to 0 Critical state
B改变D的状态 do other something if(D.stat==0) D.stat = 1 turn stat from 0 to 1 Critical state
B操作 do other something do something to data C 1 model B
B复位D的状态 do other something D.stat = 0 turn stat from 1 to 0 Critical state
结束 nil nil 0 nil

  模块AB为了安全的操作数据C都会先改变原子锁D的状态,如果D的状态不符合要求就等待直到条件允许,在成功改变D的状态后,才操作数据C,操作完毕后复位D的状态到改变前,至此流程结束。模块AB共同准守通过锁D对数据C进行操作的流程规范就是一种同步机制,锁是实现这个机制的手段(媒介)。任何模块在操作数据时,只有大家都准守这个同步机制,数据才不会发生混乱,否则数据就会出现一致性错误。比如还是以餐厅就餐的问题做比喻,如果我用眼镜提示服务员不要收走我的餐具,但是他对这个嗤之以鼻,他还是可以收走我的餐具,我对此却毫无办法。

为何会发生同步问题

  其主要原因就是需要“同时”操作数据。从就餐问题可以看出,如果服务员收盘子和我去加饭不是同时发生,就不会出现误收餐具的事情,当然不排除服务员因为不满意老板发的薪水,故意当客人的面就把餐具没收的情况。所以如果不是多线程程序,绝大多数都不需要同步机制的,但不排除信号中断也会在单进程产生同步问题,还有协程机制也会,虽然他不是绝对定义上的同时操作,后面的文章会一一举例这些情况。

临界点

  当操作者开始改变数据的那一个时间点,就是临界点。如果有多个操作者在这个点操作数据,那么这就可能会发生数据一致性错误,那么这个零界点就是需要保护的临界点。在餐厅问题中,我离开打饭,而服务员要收走餐具,他做出这个动作时就产生了零界点,如果他只是过来看一看,这个动作不算,因为他没有对我的就餐产生影响。

临界区

  任何可能产生临界点的区域就是临界区,锁需要保护的是整个临界区。因为服务员是在餐厅来回走动,如果他发现某位置上已是杯盘狼藉,没有客人且也没有任何提示,所以从客人离开桌子和服务员的视线直到回到座位上之前,他都有可能会来收取餐具,所以我在离开时,放置眼镜以作提示,直到我再次回到座位上。这段时间就是一个临界区,我们需要上锁保护的是这段时间,而非一点。

总结

  1. 同步机制是为了保护数据的一致性。
  2. 通常所说的“加锁”其实指的是采用同步机制,该处的锁是概念上的。
  3. 通常所说的锁是一个数据结构上的实体,也是实现同步机制的一种手段,但非唯一手段。
  4. 因为会临界点和临界区所以才会需要同步机制,如果多个操作者不会修改数据,那么就不要同步。

  1. 这里的就餐问题和同步机制在概念上是说得通的,但不能等同锁的使用。

  2. 这里的表格只是仅仅为简单的说明时序,并没有表达原子操作和真正的实现。
    [原子操作]:http://www.jianshu.com/p/cb7b726e943c

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,176评论 5 469
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,190评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,232评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,953评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,879评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,177评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,626评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,295评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,436评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,365评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,414评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,096评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,685评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,771评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,987评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,438评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,032评论 2 341

推荐阅读更多精彩内容