【问题标题】:pthread_cond_init if initialized statically, should it be destroyed before using it againpthread_cond_init 如果是静态初始化的,是否应该在再次使用之前将其销毁
【发布时间】:2016-08-10 14:23:29
【问题描述】:

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

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

在跟进 cmets 后编辑:

    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);
    }

【问题讨论】:

  • 你的意思是之后 pthread_cond_signal(&amp;cond)?
  • 在 pthread_cond_signal(&cond) 和解锁互斥锁之后是。

标签: pthreads


【解决方案1】:

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

在默认条件变量属性合适的情况下, 宏 PTHREAD_COND_INITIALIZER 可用于初始化条件 变量。效果相当于动态初始化 对 pthread_cond_init() 的调用,参数 attr 指定为 NULL, 除了不执行错误检查。

这是允许的。因此,只要没有其他线程在相同条件下等待(或稍后在程序中等待),销毁就可以了。

如果你打算在销毁后重新使用条件变量,那么它必须重新初始化,这是POSIX允许的:

一个被破坏的条件变量对象可以使用重新初始化 pthread_cond_init();以其他方式引用对象的结果 销毁后是未定义的。

【讨论】:

  • 我不相信你给出的引用等于禁止 pthread_cond_destroy()ing 静态初始化条件。
  • This strongly 暗示您确实需要在重新初始化之前破坏静态初始化条件:在默认条件变量属性合适的情况下,宏 PTHREAD_COND_INITIALIZER 可用于初始化条件变量。该效果应等效于通过调用 pthread_cond_init() 进行动态初始化,参数 attr 指定为 NULL,但不执行错误检查。(强调我的)。虽然不是开放组...
  • 我无意暗示。修正了措辞。对于“是否可以这样做”的问题-我找不到任何直接参考。 Butenhof 的书我说“不需要”,但如果不允许这样做,这并不能反驳。我会深入挖掘,看看是否可以在 POSIX 中找到任何参考。
  • 好吧,POSIX 没有明确区分静态和动态初始化条件作为pthread_cond_destroy() 的参数,它要求在它之前销毁一个条件可以重新初始化。到目前为止,我会说这看起来很像“是的,你确实(技术上)需要破坏条件”。
  • 您引用的措辞在 POSIX 中也是相同的。但是,就我的阅读而言,这意味着这两种初始化方式是等价的,我不确定其他是否都遵循。
猜你喜欢
  • 1970-01-01
  • 2018-01-17
  • 2014-01-22
  • 2018-11-27
  • 1970-01-01
  • 2010-10-15
  • 2019-07-09
  • 2011-04-03
  • 1970-01-01
相关资源
最近更新 更多