如果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);
}
答案 0 :(得分:0)
如果条件变量是静态初始化的(PTHREAD_COND_INITIALIZER
),那么你不需要销毁它。
虽然没有直接引用是否使用pthread_cond_wait()
销毁静态分配的条件变量,但我们可以从:
如果默认条件变量属性合适, 宏PTHREAD_COND_INITIALIZER可用于初始化条件 变量。效果应等于动态初始化 调用pthread_cond_init()并将参数attr指定为NULL, 除了没有执行错误检查。
它是允许的。因此,只要没有其他线程在相同条件下等待(或者稍后将在程序中执行),则销毁很好。
如果您打算重用条件变量,则必须将其销毁并再次重新初始化,POSIX允许:
可以使用重新初始化已销毁的条件变量对象 pthread_cond_init()在;否则引用该对象的结果 它被摧毁后是未定义的。