分布式锁
说明
分布式锁模块的引入主要是为了解决多模块使用相同资源产生的数据冲突的问题。
一个典型的应用场景就是: 夹爪和相机同时使用末端的485来进行通讯,双方的插件以及 用户脚本分别都需要和末端的485 进行通讯,而485 模块无法决定某一时间“独属于”某一个通讯双方 ,因而需要引入一个额外的工具来处理资源之间的独占关系。
举例说明超时锁的作用:
假定有一个打印机,可以立即打印出来收到的打印的请求。 有A,B,C 三个用户有打印需求,他们需要的打印任务分别是 A1,A2,A3... A10 ,B1,B2...B10,C1...C10 , 如果他们之间无沟通 且都是在自己需要的时候进行打印,此时的输出可能是 A1,B1,A2,C1, 等杂乱的情形,此时打印出来的内容 不符合任何一个用户的需求,用户需要复杂的逻辑去将自己的数据整理出来,甚至有的时候可能拿到的数据就是错误的。 此时新增一位”管理员“,专门负责管理“打印机” 的使用,假定 A最早发现了自己的打印需求,并且A及时的将打印的需求上报给管理员,此时管理员会记录“打印机独属” 于A 2min , A可以在接下来的两分钟内打印自己需要的内容。 而B 和 C在这期间尝试将自己的需求上报给管理员,管理员会让B和C等待。直到A的2分钟用完,或者是 A提前用完,管理员才会告知B和C 打印机可以用了。
总的时间图大概是这样的:
① 此时 资源 “打印机”空闲,A用户尝试申请使用权限,立即获批,获批后A给出了大概的申请使用时间(此时间不会无限多,目前设计中最大为 10秒)。
② 资源 “打印机” 开始被使用
③ B 申请使用 资源,管理员知道此时资源还在A手中,所以拒绝B的申请。让B 再等等。
④ B再次申请,再次被拒绝。
⑤ C开始申请 资源 “打印机”,管理员拒绝了C的请求。
⑥ A主动告诉管理员,资源 “打印机” 的使用结束了。
⑦ B 在A 结束的使用结束后一段时间 申请了 资源 “打印机” ,管理员告知B可以使用了。
⑧ C在B 主动结束使用打印机后,通过向管理员申请 获得了资源的使用权限。
⑨ C 开始使用资源。
⑩ C发现第一次和管理员说明的使用时间不太够,需要更多的时间,于是C 在申请时间未结束的时候向管理员再次申请了资源, 此时资源还在C哪里被使用,管理员同意C的续租。
接口
Lock(name,TimeOut,WaitTime)
- 作用: 申请锁定资源,仅能申请
- 参数说明:
参数 | 范围 | 说明 |
---|---|---|
name | 不包含空格的字符串 | 暂时未设置长度上限,但是建议不要超过128字节 |
TimeOut | [10,10000] | 申请独占资源的时间,单位毫秒 |
WaitTime | [0,0x7FFFFFFF] | 可选参数,等待的超时时间,0为不等待立即返回,大于0 为等待的最大时间。 内部使用u32类型。 |
- 返回值介绍:
返回值 | 范围 | 说明 |
---|---|---|
err | true/false | 是否成功 ,成功为true ,失败为false |
UnLock(name)
- 函数的作用: 主动释放资源。
- 参数的介绍:
- name: 要释放的资源的名字,字符串类型,范围,内容以及建议同 TimeOutLock
- 返回值介绍:
返回值 | 说明 |
---|---|
err | 是否删除是否有错误,true:无错误, false:有错误 |