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() 函数重新初始化后使用。