如何在一次调用中释放多个互斥锁

Posted

技术标签:

【中文标题】如何在一次调用中释放多个互斥锁【英文标题】:How to release multiple mutexes in one call 【发布时间】:2013-12-07 10:38:52 【问题描述】:

WinAPI 为我们提供了 WaitForMultipleObjects(..) 函数。假设我们必须等待数组中的所有互斥锁,那么如果有一个函数可以在一次调用中从数组中释放捕获的互斥锁,那就太好了。是什么让微软不给我们提供这么有用的东西?在 WaitForMultipleObjects(..) 之后释放互斥量(如果它们足够多)最好的解决方案是什么?

【问题讨论】:

您不需要以原子方式释放它们,因此不需要这样的功能。一次锁定大量互斥锁是非常不寻常的。等待死锁。 @AlanStokers 谢谢!假设我们用 WaitForMultipleObjects(..) 捕获了 5 个互斥体,一个一个地释放它们会有点混乱。 @user2543574 编写一个接受计数和HANDLE*(很像WaitForMultipleObjects)并在循环中释放它们的函数很简单。 @syam 我知道..我知道..但我很好奇微软对此有何评论? 如果您想知道 为什么 他们没有提供这样的功能,那么恐怕您的问题在 SO 上是题外话,因为我们只能 推测他们的动机,而 SO 是针对可证明的事实。至于 how (你的问题的标题)我已经给出了答案:你自己写那个微不足道的函数。 ;) 【参考方案1】:

Microsoft 的 Raymond Chen 可能没有写过您的确切主题,但他写过类似的其他人。正如他所说,“每个功能都以 -100 分开始。”您要求的功能没有迫切的需求;实现它的代码太短,不太可能在很多地方使用,并且在库中不会比在应用程序中更好。

人们已经抱怨 Win32 API 臃肿。很高兴他们没有添加这个。

【讨论】:

以上是关于如何在一次调用中释放多个互斥锁的主要内容,如果未能解决你的问题,请参考以下文章

多个线程试图锁定

进程崩溃时未释放 Win32 命名互斥锁

互斥和条件变量区别

如果我需要在锁定互斥锁后解锁它,我该如何返回一个值?

锁定多个线程

使用 CriticalSection 创建类似互斥锁的程序