递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 2466|回复: 6
打印 上一主题 下一主题

[视窗] 分享一个临界许可类

[复制链接]

346

主题

1600

帖子

6537

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
6537
QQ
跳转到指定楼层
楼主
发表于 2023-12-24 05:11:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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. }
复制代码






专业承接18-98岁xx的心理及生理教育辅导。
回复

使用道具 举报

50

主题

567

帖子

2473

积分

金牌会员

Rank: 6Rank: 6

积分
2473
沙发
发表于 2023-12-24 09:00:44 | 只看该作者
创建和销毁.写在类_初始化和类_清理.好像更实用!
回复

使用道具 举报

410

主题

2511

帖子

8281

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
8281
板凳
发表于 2023-12-24 10:30:47 来自手机 | 只看该作者
这个与互斥锁有啥区别
回复

使用道具 举报

5

主题

89

帖子

1252

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1252
地板
发表于 2023-12-24 11:05:14 | 只看该作者
本帖最后由 老道 于 2023-12-24 11:06 编辑
shuimiao 发表于 2023-12-24 10:30
这个与互斥锁有啥区别

临界区是非内核对象,只在用户态进行锁操作,速度快;互斥锁是内核对象,在核心态进行锁操作,速度慢。论坛的这个代码分享有必要解析为表格显示。否则有点抽象!累眼睛。
回复

使用道具 举报

410

主题

2511

帖子

8281

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
8281
5#
发表于 2023-12-24 12:19:16 | 只看该作者
老道 发表于 2023-12-24 11:05
临界区是非内核对象,只在用户态进行锁操作,速度快;互斥锁是内核对象,在核心态进行锁操作,速度慢。论 ...

除了速度快慢,在使用上有没有什么明显区别,会有些什么特殊差异吗?如果使用一样的话,那官方可以考虑把临界区封装到核心库,明显写上备注让人知道与互斥锁的差异
回复

使用道具 举报

26

主题

1900

帖子

6926

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
6926
6#
发表于 2023-12-24 16:02:32 | 只看该作者
上面很多人是没看过核心库的源码……
火山的「互斥锁类」就是临界区(Critical Section),「同步事件类」才是互斥对象(Mutex)。
另外由于 Linux 没有临界区这玩意,所以 C++ 标准库只有互斥量 std::mutex。
回复

使用道具 举报

26

主题

1900

帖子

6926

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
6926
7#
发表于 2023-12-24 17:29:27 | 只看该作者
呵呵仙8 发表于 2023-12-24 09:00
创建和销毁.写在类_初始化和类_清理.好像更实用!

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-24 01:25 , Processed in 0.092688 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表