【问题标题】:WaitForSingleObject With timeout=0WaitForSingleObject 超时 = 0
【发布时间】:2013-12-16 17:33:01
【问题描述】:

我有一个在非信号状态下创建的互斥锁

HANDLE hmutex= CreateMutex(NULL,FALSE,"");---1

现在我正在打电话

DWORD dw = WaitForSingleObject(hmutex,0); ---2

由于 hmutex 没有发出信号,WaitForSingleObject 会立即返回,但 hmutex 的状态会变成已发出信号??

如果另一个线程调用第二条语句会发生什么?

【问题讨论】:

  • 您正在创建一个名称为空的命名互斥锁。这是故意的吗?
  • 是的,这是故意的
  • 不要那样做(使用空名),这是在乞求碰撞。如果您不想要名称,请传递 NULL 并接收未命名的互斥体。
  • @Ben: 谢谢你的建议,会处理的

标签: multithreading winapi visual-c++ mutex


【解决方案1】:

不,它不会更改为已发出信号。

关于该调用的以下不变量是正确的:

  • 无论互斥体状态如何,它都会立即返回。
  • 无论其先前的状态如何,互斥体都变为拥有(未发出信号)。
  • 返回值告诉您是获得所有权还是由于争用而失败。

在所有情况下,都有人拥有互斥锁。但是,如果另一个线程是所有者,它可以随时释放互斥锁,因此当函数在几个处理器周期后返回时,它可能会被释放(发出信号)。

【讨论】:

    【解决方案2】:

    不要将互斥对象视为有信号或无信号。相反,将它们视为拥有或不拥有。

    下面调用中的第二个参数表示互斥锁最初是无主的。

    HANDLE hmutex= CreateMutex(NULL,FALSE,"");
    

    第一次进行下面的调用时,调用线程将获得互斥锁的所有权。如果另一个线程在第一个线程拥有互斥锁时进行相同的调用,则返回值将是WAIT_TIMEOUT(十进制258,十六进制102)。

    DWORD dw = WaitForSingleObject(hmutex,0);
    

    以下是一些需要遵循的准则。如果您需要限制对由多个进程共享的资源的访问,请使用互斥锁。如果您在单个进程中限制对资源的访问,请改用CRITICAL_SECTION。如果您想要一个线程可以用来向另一个线程发送信号的对象,请使用events

    【讨论】:

    • 然后有信号量。和条件变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2011-05-11
    相关资源
    最近更新 更多