Linux编程-条件变量

本文最后更新于:1 年前

  • 阻塞线程,直至接收到“条件成立”的信号;
  • 向等待队列中的一个或所有线程发送“条件成立”的信号,解除它们的“被阻塞”状态。
  • 使用时必须和一个互斥锁搭配

初始化条件变量

方式一:

pthread_cond_t myCond = PTHREAD_COND_INITIALIZER;

方式二:

int pthread_cond_init(pthread_cond_t * cond, const pthread_condattr_t * attr);

参数 cond 用于指明要初始化的条件变量;参数 attr 用于自定义条件变量的属性,通常我们将它赋值为 NULL,表示以系统默认的属性完成初始化操作。

pthread_cond_init() 函数初始化成功时返回数字 0,反之函数返回非零数。

阻塞当前线程,等待条件成立

当条件不成立时,条件变量可以阻塞当前线程,所有被阻塞的线程会构成一个等待队列。

int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);

int pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t* mutex, const struct timespec* abstime);

函数尚未接收到“条件成立”的信号之前,它将一直阻塞线程执行。注意,当函数接收到“条件成立”的信号后,它并不会立即结束对线程的阻塞,而是先完成对互斥锁的“加锁”操作,然后才解除阻塞。

pthread_cond_timedwait() 函数只能在 abstime 参数指定的时间内阻塞线程,超出时限后,该函数将重新对互斥锁执行“加锁”操作,并解除对线程的阻塞,函数的返回值为 ETIMEDOUT。

如果函数成功接收到了“条件成立”的信号,重新对互斥锁完成了“加锁”并使线程继续执行,函数返回数字 0,反之则返回非零数。

解除线程的阻塞状态

int pthread_cond_signal(pthread_cond_t* cond);

int pthread_cond_broadcast(pthread_cond_t* cond);

销毁条件变量

int pthread_cond_destroy(pthread_cond_t *cond);

成功销毁 cond 参数指定的条件变量,返回数字 0,反之返回非零数。

销毁后的条件变量还可以调用 pthread_cond_init() 函数重新初始化后使用。