WaitHandle.WaitAny 和 Semaphore 类

2023-11-25

Edit:我想说这个问题只是暂时的精神错乱,但当时这是有道理的(见下面的编辑2)。

对于 .NET 3.5 项目,我有两种类型的资源(R1 and R2)我需要检查其可用性。每种资源类型在任何时候都可以有(比如说)10 个实例。

当任一类型的资源可用时,我的工作线程需要唤醒(线程数量可变)。在早期的实现中,只有一种资源类型,我使用信号量来检查可用性。

现在我需要等待两个单独的信号量(S1 and S2)跟踪资源的可用性。

WaitHandle[] waitHandles = new WaitHandle[] { s1, s2 };
int signalledHandle = WaitHandle.WaitAny(waitHandles);

switch (signalledHandle)
{
    case 0:
        // Do stuff
        s1.Release();
    case 1:
        // Do stuff
        s2.Release();
}

然而,这有一个问题。来自 MSDN 文档WaitAny:

如果多个对象变成 在通话过程中发出信号,返回 value 是数组索引 具有最小信号的对象 所有信号的索引值 对象。

这表明我在调用后可能将两个信号量计数都减少了 1WaitAny。因为signalledHandle将表明 s1 已收到信号,我将开始使用资源R1,并在完成后释放它。然而,由于我不知道是否S2无论是否发出信号,该资源的可用性计数现在可能已关闭。如果这种情况发生 10 次,我的信号量将永久“空”并且资源R2将不再被使用。

处理这个问题的最佳方法是什么?我是否应该从使用两个信号量切换到简单计数器,并在任一计数器发生更改时使用 AutoResetEvent 发出信号?我错过了一些更优雅的方法吗?

Edit 1:
根据 Ravadre 的说法,只有一个信号量在之后实际上会被改变WaitAny。稍微修改他的示例似乎证实了这一点,但是有没有人可以向我指出一些指定这一点的官方文档?

Edit 2:
我在回家的路上思考着这个问题。直到那时我才意识到这一定是真的WaitAny有任何用处。这个问题不限于信号量,而是任何类型的同步对象,使得WaitAny实际上没用。


如果我正确理解你的问题,我认为你的解决方案完全没问题,你只是过度解释了 msdn 的引用。打电话时WaitHandle.WaitAny()您将获得最低的索引,但您将仅锁定一个 waitHandle(在本例中为信号量),请检查以下示例代码:


Semaphore s1 = new Semaphore(1, 2);
Semaphore s2 = new Semaphore(1, 2);

WaitHandle[] handles = new WaitHandle[] { s1, s2 };

int x = WaitHandle.WaitAny(handles);

int prevS1 = s1.Release();
int prevS2 = s2.Release();

在这种情况下,prevS1将等于 0,因为信号量s1“被等待”,所以它的计数器已减少到 0,而prevS2将等于 1,因为它的状态自实例化以来没有改变(Release()方法返回释放之前的计数器,因此返回 1 意味着“以前是 1,现在是 2”)。

您可能想查看的另一个资源:http://www.albahari.com/threading/part2.aspx#_Wait_Handles。尽管它不是“官方”来源,但我认为没有理由认为它不可靠。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WaitHandle.WaitAny 和 Semaphore 类 的相关文章

  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 使用 C# 读取 Soap 消息

  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 从 Excel 应用程序对象中查找位数(32 位/64 位)?

    是否可以从 Microsoft Office Interop Excel ApplicationClass 确定 Excel 是以 32 位还是 64 位运行 Edit该解决方案应该适用于 Excel 2010 和 Excel 2007 此
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • 如何改进该 Java 代码以查找字符串中的子字符串?

    最近 我被要求提交一份工作问题的解决方案 Problem 在字符串中查找子字符串 Input Little star s deep dish pizza sure is fantastic Search deep dish pizza Ou
  • 对 x86 上 L1 缓存行的独占访问?

    如果有一个 64 字节的缓冲区被大量读 写 那么它很可能会保留在 L1 中 但有什么办法可以强制这种行为吗 例如 给予一个核心对这 64 字节的独占访问权限 并告诉它不要与其他核心或内存控制器同步数据 以便这 64 字节始终存在于一个核心的
  • “self”在 iOS 5.1 上的调试器中不可用

    我正在尝试调试在 iOS 5 1 下运行的问题 当我在出现错误的代码内的调试器中停止并尝试使用调试器打印某些内容时 我收到消息 错误 警告 在声称捕获的上下文中停止 Objective C 对象指针 但 self 不可用 假装我们 在一般背
  • IE 的 ajax (XDR) 响应不一致

    我正在从 iframe 发出 ajax 请求 该请求通过 IE 插件注入到每个页面上 我用的是IE跨域请求因为 jQuery 的 ajax 在 IE 上失败 这在 IE8 和 9 上的运行时间为 75 另外 25 xdr onload甚至不
  • 从 RPC 编码的 WSDL 生成 Java 客户端的最简单方法是什么

    我对 Web 服务的概念不熟悉 目前正在开发一个项目 需要通过 SOAP 从外部应用程序检索一些数据 该应用程序提供了 RPC 编码的 WSDL 目前 我发现由于 RPC 被取代 用 Java 为该服务创建客户端非常困难 到目前为止 我得到
  • 从 .NET 应用程序捕获控制台输出 (C#)

    如何从 NET 应用程序调用控制台应用程序并捕获控制台中生成的所有输出 请记住 我不想先将信息保存在文件中 然后重新列出 因为我希望实时接收它 使用以下命令可以很容易地实现这一点ProcessStartInfo RedirectStanda
  • SCRIPT、STYLE 和 LINK 元素上的类型属性是否仍然需要?

    您将看到许多网站具有以下类型的代码 脚本元素 链接元素 风格元素 我的问题是这样的 Are the type当今流行的浏览器需要哪些属性 通俗指 IE 8 Firefox Webkit Opera 和 Chrome 如果你会发生什么do n
  • 在 Android Service 类中哪里停止/销毁线程?

    我通过以下方式创建了线程服务 public class TCPClientService extends Service Override public void onCreate Measurements new LinkedList
  • psycopg2 的 AWS Lambda 层

    我正在尝试创建一个新的 lambda 层来使用 psycopg2 导入 zip 文件 因为该库使我的部署包超过 3MB 并且我再也看不到 lambda 函数中的内联代码 我使用 Python 3 7 为以下 2 种情况创建了 lambda
  • 导入模块只是为了运行它

    我有一个 JavaScript 文件 它为我正在使用的表单验证库注册验证器 这些验证器可以通过该库访问 因此我不需要将其导入到任何地方 我只需要确保它运行一次 如何在 es6 中以这种方式导入模块 项目中执行此操作的最佳位置是什么 我目前将
  • 如何在firebase云函数中从通配符获取数据

    假设我触发以下事件ref users userId items newItem 我想从通配符内部获取一个值userId 我努力了var token event params userId token但它返回未定义 有什么建议么 在 fire
  • Gradle:如何从 JScience jar 依赖项中排除 javax.realtime 包(多个 dex 定义)

    我在 Android 应用程序中使用 Gradle 我想使用 JScience 库依赖项 我以这种方式添加了库 dependencies compile fileTree dir libs include jar compile org j
  • 自定义弹出编辑器中的 kendoui 验证工具提示未正确定位

    请参见jsfiddle例如 空白 名字 字段以显示验证工具提示 在正常形式中 验证工具提示正确地位于每个元素的右侧 但在网格的弹出编辑器中 它仍然尝试将工具提示放置在元素下方 就像它在内联编辑一样 我努力了 span class k inv
  • 在 Perl 中覆盖区分大小写的正则表达式

    是否可以覆盖 Perl 中先前定义的正则表达式的区分大小写 例如 如果我有以下内容 my upper qr BLAH x my lower qr upper xi warn blah lower 我希望第三行打印出正匹配 您可以添加 i正则
  • 如何让 32 位 Perl 读取 64 位 Windows 注册表?

    我有一个 32 位 Perl 安装程序 使用它我需要能够安装和卸载 32 位和 64 位应用程序 安装 32 位和 64 位就可以了 卸载32位也可以 但是 我在卸载 64 位应用程序时遇到问题 应用程序只知道应用程序的名称 如控制面板中的
  • React 路由器重定向条件

    我正在尝试制作一个按钮 仅在验证正确完成后将用户重定向到新页面 有没有办法做这样的事情 如何在类方法内激活路由 import validator from validator class Example constructor props
  • 使用 microsoft.web.helpers 后登录重定向发生变化

    在 asp net mvc3 网站中 我导入了 microsoft web helpers webmatrix data 和 webmatrix webdata 之后 我发现当我在控制器中的某些 ActionResults 上使用 Auth
  • Rails 3 引擎和静态资源

    我正在构建一个捆绑为 gem 的引擎 gmaps4rails 我将引擎的 public 复制到了 Rails 应用程序的 public 中 在开发中一切正常 但在生产中无法正常工作 似乎找不到静态资产 我的引擎和我的主应用程序 日志讲述了以
  • Bash 脚本将日期和时间列转换为 .csv 中的 unix 时间戳

    我正在尝试创建一个脚本来将 csv 文件中的两列 日期和时间 转换为 unix 时间戳 因此 我需要从每一行获取日期和时间列 将其转换并将其插入到末尾包含时间戳的附加列中 有人可以帮助我吗 到目前为止 我已经发现了将任何给定时间和日期转换为
  • WaitHandle.WaitAny 和 Semaphore 类

    Edit 我想说这个问题只是暂时的精神错乱 但当时这是有道理的 见下面的编辑2 对于 NET 3 5 项目 我有两种类型的资源 R1 and R2 我需要检查其可用性 每种资源类型在任何时候都可以有 比如说 10 个实例 当任一类型的资源可