代码之家  ›  专栏  ›  技术社区  ›  Nicholas Mancuso

pthread\u cond\t的EventWaitHandle行为

  •  1
  • Nicholas Mancuso  · 技术社区  · 17 年前

    我最近看到了EventWaitHandle在C#中的强大行为,并决定在姐妹应用程序中移动一些功能来实现同样的功能。唯一的问题是姐妹应用程序是用C编写的。

    现在我的测试结果是否定的。也就是说,如果ThreadA在ThreadB等待之前发出信号,ThreadB将不确定地等待。我是否可以使用另一种pthread类型,其行为更接近C#中EventWaitHandle的功能?对象发出信号,这意味着等待它的第一个线程将立即通过,并将其设置为unsignalled。

    将pthread_cond包装到另一个数据结构中并不难实现这一点。但是,这个功能在pthread库中已经可用了吗?

    3 回复  |  直到 17 年前
        1
  •  4
  •   C. K. Young    17 年前

    代码的基本流程应该是(伪代码):

    lock(lockobj);
    while (!signalled) {
        wait(condvar);
    }
    signalled = false;
    unlock(lockobj);
    

    在等待方,以及:

    lock(lockobj);
    signalled = true;
    notify(condvar);
    unlock(lockobj);
    

        2
  •  0
  •   C. K. Young    17 年前

    如果需要,可选择答案(也使用伪代码) 多信号 (即,如果发出两次信号,则两个线程可以在状态再次取消调用之前等待)。

    候车区:

    lock(lockobj);
    while (signalled != 0) {
        wait(condvar);
    }
    --signalled;
    unlock(lockobj);
    

    信号侧:

    lock(lockobj);
    ++signalled;
    notify(condvar);
    unlock(lockobj);
    
        3
  •  0
  •   Nicholas Mancuso    17 年前

    最后,我只是在一个新结构中包装了一个条件类型,并创建了一些简单的函数,其行为与C#中的EventWaitHandle非常相似。我需要两个互斥体来实现正确的序列化访问。

    cond_mutex用于等待条件变量,而data_mutex用于将状态从signaled设置为not signaled。

    重置模式与C#相同。自动或手动。这允许事件等待在等待后自动重置自身。或者让程序员通过调用event_wait_reset(event_wait_t*ewh)手动执行此操作;