信号量对象没有所有者

2023-05-29 0 1,034

相对常量第一类(Mutex)和零点区第一类(Critical Section) ,surrounding没拥有者,它多于算数。

ReleaseSemaphore 表达式Sonbhadra以选定的数目减少相关联surrounding第一类的算数。 (减少算数那个姿势,可能会释放出来已经开始等候的缓存)但释放出来surrounding的缓存无须与起初新闻稿它的缓存完全相同。这与常量第一类和零点区第一类相同,前者明确要求新闻稿缓存也是释放出来缓存。

很多人以类似于常量第一类的形式采用surrounding: 她们建立两个如上所述算数为 1 的surrounding,并像这种采用它,如上面标识符右图:

WaitForSingleObject(hSemaphore, INFINITE);… do stuff ..ReleaseSemaphore(hSemaphore, 1, NULL);

假如缓存在想尽办法释放出来surrounding以后选择退出(或崩盘),则surrounding算数器不能手动还原成。相对常量第一类,假如拥有者缓存在所持常量第一类时中止,则释放出来常量第一类。因而,对此种使用商业模式,采用常量第一类更为最合适许多。

假如天然资源的基本概念使用权能跨缓存,则surrounding十分管用。他们上看右图:

信号量对象没有所有者

此基本功呼吸困难用作常量第一类或零点区第一类,即使常量第一类和零点区第一类具备拥有者,因而多于拥有者就能释放出来常量第一类或零点区第一类。

请注意,假如 KeepWorking 表达式选择退出并忘记释放出来surrounding,则算数器不能手动恢复。操作系统不知道surrounding”属于”该工作项。

surrounding的另一种常见用法商业模式与天然资源保护商业模式相反:它是天然资源生成商业模式。在此模型中,surrounding算数通常为零,但在有工作要完成时递增。

信号量对象没有所有者

请注意,在此种情况下,甚至没surrounding的基本概念”拥有者”,除非你将工作项本身(位于工作列表数据结构上的某处)视为拥有者。假如 ProcessWork 缓存选择退出,则不希望手动释放出来surrounding,那会破坏掉内部算数。在此种情况下,surrounding是最合适的第一类。

(生产者/采用者surrounding的更高性能版本是 I/O 完成端口。)

总结

既然提到了所谓的高性能版本,我想原作者所表达的意思是:对尔等 C++ 工人来说,平常采用无妨,但假如是性能攸关的标识符,频繁地切换内核上下文所带来的性能开销,不可小视。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对广大Windows平台开发者来说,确实十分有帮助。本文来自:《Semaphores don’t have owners》

信号量对象没有所有者
举报/反馈

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务