【问题标题】:win32 Semaphoreswin32 信号量
【发布时间】:2012-03-01 23:53:03
【问题描述】:

我正在尝试创建一个简单的信号量,它只允许 1 个线程增加计数变量,但我目前所做的似乎不起作用。我的语法有问题还是我完全走错了路? (我将信号量互斥体命名为,因为它的值只能是 0 或 1)

WaitForSingleObject(mutex, 0);
count = count + 1;
ReleaseSemaphore(mutex, 1, NULL);

【问题讨论】:

  • 请检查返回值是否存在错误情况,尤其是在多线程代码中,因为您无法通过测试有效地证明它是正确的,所以实际上必须通过构造正确。对于值的原子增量的特定情况,请考虑使用InterlockedIncrement() 或其近亲之一。
  • 对于这种情况,关键部分不是更好,或者可能是 Interlocked* 函数集。

标签: multithreading winapi semaphore


【解决方案1】:

来自the MSDN page,重点添加:

DWORD WINAPI WaitForSingleObject(
    __in  HANDLE hHandle,
    __in  DWORD dwMilliseconds
);

dwMilliseconds [in]
超时间隔,以毫秒为单位。如果指定了非零值,则函数将一直等待,直到对象发出信号或间隔结束。 如果 dwMilliseconds 为零,如果对象没有发出信号,则函数不会进入等待状态;它总是立即返回。如果 dwMillisecondsINFINITE,则该函数仅在对象发出信号时返回。

【讨论】:

    【解决方案2】:

    尝试使用INFINITE 而不是零作为WaitForSingleObject 的第二个参数。

    【讨论】:

    • 无限的同样问题。我想要做的是使用多个线程按从 0 到 10 的顺序打印出计数。所以我有一个线程打印值,然后在增量上使用信号量进行互斥,因此两个线程不能同时增加值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 2011-02-14
    • 2018-10-11
    • 2020-02-16
    • 1970-01-01
    • 2014-04-05
    相关资源
    最近更新 更多