【问题标题】:Using pthread condition waits in a structure在结构中使用 pthread 条件等待
【发布时间】:2009-04-08 13:54:06
【问题描述】:

我之前询问过如何在不使用 pthread_join 的情况下同步两个线程,我能够使用 pthread_cond_wait 和 pthread_cond_signal 解决它。 我编写了一个小结构来将此功能捆绑到一个地方:

struct ConditionWait
{
    int                 i_ConditionPredicate;
    pthread_mutex_t     lock_Var;
    pthread_cond_t      cond_Var;
    int                 i_ValidResult;

    ConditionWait()
    {
        pthread_mutex_init(&lock_Var, NULL);
        pthread_cond_init(&cond_Var, NULL);
        i_ValidResult = 1;
        i_ConditionPredicate = 0;
    }

    void Signal()
    {
        pthread_mutex_lock(&lock_Var);
        i_ConditionPredicate = i_ValidResult;
        pthread_cond_signal(&cond_Var);
        pthread_mutex_unlock(&lock_Var);
    }

    void Wait()
    {
        pthread_mutex_lock(&lock_Var);

        while(i_ConditionPredicate != i_ValidResult)
        {
            pthread_cond_wait(&cond_Var, &lock_Var);
        }
        pthread_mutex_unlock(&lock_Var);
    }
};

假设我从两个不同的线程调用 Wait() 和 Signal(),这是否是线程安全的。在同一个对象的两个函数中使用同一个锁会导致死锁或竞争条件吗?

编辑:我现在在我的程序中使用它,它工作正常。我不太确定这是否只是运气

【问题讨论】:

    标签: c++ pthreads


    【解决方案1】:

    这只会工作一次,在你唤醒等待的线程之后,下一次等待的尝试都将成功并且永远不会阻塞,因为你从未“重置”条件谓词。如果这是您想要的(或者在您的情况下无关紧要),那么是的,这是安全的,并且是通常使用条件变量的方式。

    PS:你也应该在这个东西的析构函数中使用pthread_mutex_destroy()pthread_cond_destroy()

    【讨论】:

      猜你喜欢
      • 2011-04-04
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      相关资源
      最近更新 更多