代码之家  ›  专栏  ›  技术社区  ›  Gayan

在结构中使用pthread条件等待

  •  2
  • Gayan  · 技术社区  · 15 年前

    我以前询问过在不使用pthread_join的情况下同步两个线程,我可以使用pthread_cond_wait和pthread_cond_信号来解决这个问题。 我编写了一个小结构,将此功能捆绑到一个位置:

    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(),这是线程安全的吗?在同一对象的两个函数中使用相同的锁会导致死锁或争用条件吗?

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

    1 回复  |  直到 15 年前
        1
  •  5
  •   Greg Rogers    15 年前

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

    附言:你也应该使用 pthread_mutex_destroy() pthread_cond_destroy() 在这个东西的毁灭者。