pthread_cond_init如果静态初始化,应该在再次使用之前将其销毁

时间:2016-08-10 14:23:29

标签: pthreads

如果pthread_cond_init静态初始化如下,则pthread_cond_t cond = PTHREAD_COND_INITIALIZER;然后当发出pthread_cond_signal(& cond)时,是否应该在再次等待条件之前销毁cond变量?

我在下面提到它并不解释这种情况。 http://linux.die.net/man/3/pthread_cond_init

编辑后跟着评论:

    pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
    pthread_cond_t  cond=PTHREAD_COND_INITIALIZER;
    pthread_attr_t attr;
    int functionA (int a)
    {
        while ( a> 10)
        {
            pthread_mutex_lock(&mutex);
            pthread_cond_signal(&cond);
            a =15;
            pthread_mutex_unlock(&mutex);
            //pthread_cond_destroy(&cond); --- destroy after signalling
            usleep(1000);
        }
    }

    int functionB (int a)
    {
      while ( a > 10)
      {
        //pthread_attr_init( &attr );
       //  pthread_cond_init(&cond, &attr); --- if cond is destryoed
        pthread_mutex_lock(&mutex);
        pthread_cond_wait(&cond);
        printf(" condition is unblocked <%d>",a);
        pthread_mutex_unlock(&mutex);
        usleep(1000);
      }
    }

    int main (void)
    {
        int a =5;   

        pthread_attr_init( &attr );
        pthread_create( NULL, &attr, functionB, NULL);
        pthread_create( NULL, &attr, functionA, NULL);
        while (1);
    }

1 个答案:

答案 0 :(得分:0)

如果条件变量是静态初始化的(PTHREAD_COND_INITIALIZER),那么你不需要销毁它。 虽然没有直接引用是否使用pthread_cond_wait()销毁静态分配的条件变量,但我们可以从:

  

如果默认条件变量属性合适,   宏PTHREAD_COND_INITIALIZER可用于初始化条件   变量。效果应等于动态初始化   调用pthread_cond_init()并将参数attr指定为NULL,   除了没有执行错误检查。

它是允许的。因此,只要没有其他线程在相同条件下等待(或者稍后将在程序中执行),则销毁很好。

如果您打算重用条件变量,则必须将其销毁并再次重新初始化,POSIX允许:

  

可以使用重新初始化已销毁的条件变量对象   pthread_cond_init()在;否则引用该对象的结果   它被摧毁后是未定义的。