分享一个临界许可类
本帖最后由 urenai 于 2023-12-24 22:00 编辑重新编辑一下帖子,之前发过面向对象的临界类,这次分享的这个使用方式不一样。在创建时会返回指针,方便保存。干脆再次发一遍吧。
第一种:
变量 cs <类型 = 变整数>
cs = 临界.创建 ()
临界.进入 (cs)
临界.退出 (cs)
调试输出 (cs, 临界.尝试 (cs))
临界.销毁 (cs)
<火山程序 类型 = "通常" 版本 = 1 />
类 临界 <公开 折叠>
{
方法 创建 <公开 静态 类型 = 变整数 注释 = "创建许可证" 返回值注释 = "返回临界指针" @禁止流程检查 = 真>
{
@ LPCRITICAL_SECTION cs = new CRITICAL_SECTION;
@ ::InitializeCriticalSection(cs);
@ return (INT_P)cs;
}
方法 销毁 <公开 静态 注释 = "销毁许可证" @禁止流程检查 = 真>
参数 lpCriticalSection <类型 = 变整数>
{
@ ::DeleteCriticalSection((LPCRITICAL_SECTION)@<lpCriticalSection>);
@ delete (void*)@<lpCriticalSection>;
}
方法 进入 <公开 静态 注释 = "进入许可区" 折叠 @嵌入式方法 = "">
参数 lpCriticalSection <类型 = 变整数>
{
@ ::EnterCriticalSection((LPCRITICAL_SECTION)@<lpCriticalSection>)
}
方法 退出 <公开 静态 注释 = "退出许可区" 折叠 @嵌入式方法 = "">
参数 lpCriticalSection <类型 = 变整数>
{
@ ::LeaveCriticalSection((LPCRITICAL_SECTION)@<lpCriticalSection>)
}
方法 尝试 <公开 静态 类型 = 逻辑型 注释 = "尝试进入许可证" 折叠 @嵌入式方法 = "">
参数 lpCriticalSection <类型 = 变整数>
{
@ (BOOL)::TryEnterCriticalSection((LPCRITICAL_SECTION)@<lpCriticalSection>)
}
#
}
第二种:
变量 cs <类型 = 临界类>
调试输出(cs.尝试())
cs.进入 ()
cs.退出 ()
或者:
变量 cs <类型 = 变整数>
cs = 创建对象指针 (临界类)
调试输出 (读指针处对象 (cs, 临界类).尝试 ())
读指针处对象 (cs, 临界类).进入 ()
读指针处对象 (cs, 临界类).退出 ()
<火山程序 类型 = "通常" 版本 = 1 />
类 临界类 <公开 "">
{
# @begin
# <> <include>
# CRITICAL_SECTION cs;
# <> </include>
# @end
方法 类_初始化 <"">
{
@ ::InitializeCriticalSection(&cs);
}
方法 类_清理
{
@ DeleteCriticalSection(&cs);
}
方法 进入 <公开 @嵌入式方法 = "">
{
@ EnterCriticalSection(&@sn<this>.cs)
}
方法 退出 <公开 编辑时信息 = "43FFB, 0, 0, 0" @嵌入式方法 = "">
{
@ LeaveCriticalSection(&@sn<this>.cs)
}
方法 尝试 <公开 类型 = 逻辑型 @嵌入式方法 = "">
{
@ TryEnterCriticalSection(&@sn<this>.cs)
}
}
创建和销毁.写在类_初始化和类_清理.好像更实用! 这个与互斥锁有啥区别 本帖最后由 老道 于 2023-12-24 11:06 编辑
shuimiao 发表于 2023-12-24 10:30
这个与互斥锁有啥区别
临界区是非内核对象,只在用户态进行锁操作,速度快;互斥锁是内核对象,在核心态进行锁操作,速度慢。论坛的这个代码分享有必要解析为表格显示。否则有点抽象!累眼睛。 老道 发表于 2023-12-24 11:05
临界区是非内核对象,只在用户态进行锁操作,速度快;互斥锁是内核对象,在核心态进行锁操作,速度慢。论 ...
除了速度快慢,在使用上有没有什么明显区别,会有些什么特殊差异吗?如果使用一样的话,那官方可以考虑把临界区封装到核心库,明显写上备注让人知道与互斥锁的差异 上面很多人是没看过核心库的源码……
火山的「互斥锁类」就是临界区(Critical Section),「同步事件类」才是互斥对象(Mutex)。
另外由于 Linux 没有临界区这玩意,所以 C++ 标准库只有互斥量 std::mutex。 呵呵仙8 发表于 2023-12-24 09:00
创建和销毁.写在类_初始化和类_清理.好像更实用!
他这个写法是面向过程的,不能触发类_初始化和清理,面向对象直接用核心库的 互斥锁类 就行了
页:
[1]