递归火山软件开发平台

标题: 分享一个临界许可类 [打印本页]

作者: urenai    时间: 2023-12-24 05:11
标题: 分享一个临界许可类
本帖最后由 urenai 于 2023-12-24 22:00 编辑

重新编辑一下帖子,之前发过面向对象的临界类,这次分享的这个使用方式不一样。在创建时会返回指针,方便保存。干脆再次发一遍吧。
第一种:

变量 cs <类型 = 变整数>
cs = 临界.创建 ()
临界.进入 (cs)
临界.退出 (cs)
调试输出 (cs, 临界.尝试 (cs))
临界.销毁 (cs)
  1. <火山程序 类型 = "通常" 版本 = 1 />

  2. 类 临界 <公开 折叠>
  3. {
  4.     方法 创建 <公开 静态 类型 = 变整数 注释 = "创建许可证" 返回值注释 = "返回临界指针" @禁止流程检查 = 真>
  5.     {
  6.         @ LPCRITICAL_SECTION cs = new CRITICAL_SECTION;
  7.         @ ::InitializeCriticalSection(cs);
  8.         @ return (INT_P)cs;
  9.     }

  10.     方法 销毁 <公开 静态 注释 = "销毁许可证" @禁止流程检查 = 真>
  11.     参数 lpCriticalSection <类型 = 变整数>
  12.     {
  13.         @ ::DeleteCriticalSection((LPCRITICAL_SECTION)@<lpCriticalSection>);
  14.         @ delete (void*)@<lpCriticalSection>;
  15.     }

  16.     方法 进入 <公开 静态 注释 = "进入许可区" 折叠 @嵌入式方法 = "">
  17.     参数 lpCriticalSection <类型 = 变整数>
  18.     {
  19.         @ ::EnterCriticalSection((LPCRITICAL_SECTION)@<lpCriticalSection>)
  20.     }

  21.     方法 退出 <公开 静态 注释 = "退出许可区" 折叠 @嵌入式方法 = "">
  22.     参数 lpCriticalSection <类型 = 变整数>
  23.     {
  24.         @ ::LeaveCriticalSection((LPCRITICAL_SECTION)@<lpCriticalSection>)
  25.     }

  26.     方法 尝试 <公开 静态 类型 = 逻辑型 注释 = "尝试进入许可证" 折叠 @嵌入式方法 = "">
  27.     参数 lpCriticalSection <类型 = 变整数>
  28.     {
  29.         @ (BOOL)::TryEnterCriticalSection((LPCRITICAL_SECTION)@<lpCriticalSection>)
  30.     }

  31.     #
  32. }
复制代码

第二种:

变量 cs <类型 = 临界类>
调试输出(cs.尝试())
cs.进入 ()
cs.退出 ()

或者
变量 cs <类型 = 变整数>
cs = 创建对象指针 (临界类)

调试输出 (读指针处对象 (cs, 临界类).尝试 ())
读指针处对象 (cs, 临界类).进入 ()
读指针处对象 (cs, 临界类).退出 ()


  1. <火山程序 类型 = "通常" 版本 = 1 />

  2. 类 临界类 <公开 "">
  3. {

  4.     # @begin
  5.     # <> <include>
  6.     # CRITICAL_SECTION cs;
  7.     # <> </include>
  8.     # @end

  9.     方法 类_初始化 <"">
  10.     {
  11.         @ ::InitializeCriticalSection(&cs);
  12.     }

  13.     方法 类_清理
  14.     {
  15.         @ DeleteCriticalSection(&cs);
  16.     }

  17.     方法 进入 <公开 @嵌入式方法 = "">
  18.     {
  19.         @ EnterCriticalSection(&@sn<this>.cs)
  20.     }

  21.     方法 退出 <公开 编辑时信息 = "43FFB, 0, 0, 0" @嵌入式方法 = "">
  22.     {
  23.         @ LeaveCriticalSection(&@sn<this>.cs)
  24.     }

  25.     方法 尝试 <公开 类型 = 逻辑型 @嵌入式方法 = "">
  26.     {
  27.         @ TryEnterCriticalSection(&@sn<this>.cs)
  28.     }
  29. }
复制代码







作者: 呵呵仙8    时间: 2023-12-24 09:00
创建和销毁.写在类_初始化和类_清理.好像更实用!
作者: shuimiao    时间: 2023-12-24 10:30
这个与互斥锁有啥区别
作者: 老道    时间: 2023-12-24 11:05
本帖最后由 老道 于 2023-12-24 11:06 编辑
shuimiao 发表于 2023-12-24 10:30
这个与互斥锁有啥区别

临界区是非内核对象,只在用户态进行锁操作,速度快;互斥锁是内核对象,在核心态进行锁操作,速度慢。论坛的这个代码分享有必要解析为表格显示。否则有点抽象!累眼睛。
作者: shuimiao    时间: 2023-12-24 12:19
老道 发表于 2023-12-24 11:05
临界区是非内核对象,只在用户态进行锁操作,速度快;互斥锁是内核对象,在核心态进行锁操作,速度慢。论 ...

除了速度快慢,在使用上有没有什么明显区别,会有些什么特殊差异吗?如果使用一样的话,那官方可以考虑把临界区封装到核心库,明显写上备注让人知道与互斥锁的差异
作者: Xelloss0618    时间: 2023-12-24 16:02
上面很多人是没看过核心库的源码……
火山的「互斥锁类」就是临界区(Critical Section),「同步事件类」才是互斥对象(Mutex)。
另外由于 Linux 没有临界区这玩意,所以 C++ 标准库只有互斥量 std::mutex。
作者: Xelloss0618    时间: 2023-12-24 17:29
呵呵仙8 发表于 2023-12-24 09:00
创建和销毁.写在类_初始化和类_清理.好像更实用!

他这个写法是面向过程的,不能触发类_初始化和清理,面向对象直接用核心库的 互斥锁类 就行了




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4