一、概述
条件变量(pthread_cond_t
)是POSIX线程(也称为pthread)库中用于线程同步的一种机制。在多线程程序中,条件变量通常与互斥锁(pthread_mutex_t
)一起使用,以防止并发问题,如竞态条件和死锁。
二、条件变量(pthread_cond_t)操作函数
1. pthread_cond_init
初始化一个条件变量。
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
2. pthread_cond_destroy
销毁条件变量。
int pthread_cond_destroy(pthread_cond_t *cond);
3. pthread_cond_wait
在等待条件变量时,阻塞线程并释放互斥锁。当被pthread_cond_signal或pthread_cond_broadcast唤醒时,线程重新获得锁,并继续执行。
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
4. pthread_cond_timedwait
类似于`pthread_cond_wait`,但加入了超时限制。如果条件在超时之前没有得到满足,函数返回一个错误码。
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
5. pthread_cond_signal
唤醒至少一个等待给定条件变量的线程。
int pthread_cond_signal(pthread_cond_t *cond);
6. pthread_cond_broadcast
唤醒所有等待给定条件变量的线程。
int pthread_cond_broadcast(pthread_cond_t *cond);
三、互斥锁(pthread_mutex_t
)操作函数
1. pthread_mutex_init
初始化一个互斥锁。
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
2. pthread_mutex_lock
锁定互斥锁。如果已经被锁定,线程将阻塞,直到锁被解锁。
int pthread_mutex_lock(pthread_mutex_t *mutex);
3. pthread_mutex_unlock
解锁互斥锁。
int pthread_mutex_unlock(pthread_mutex_t *mutex);
4. pthread_mutex_destroy
销毁互斥锁。
int pthread_mutex_destroy(pthread_mutex_t *mutex);
四、代码示例
以下是利用条件变量和互斥锁进行线程同步的代码示例:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
// 全局变量
pthread_mutex_t mutex;
pthread_cond_t cond;
int ready = 0;
// 线程函数
void* thread_func(void* arg) {
// 加锁
pthread_mutex_lock(&mutex);
// 等待条件变量变为ready
while (!ready) {
pthread_cond_wait(&cond, &mutex);
}
printf("Thread %ld is now running.\n", (long)arg);
// 解锁
pthread_mutex_unlock(&mutex);
return NULL;
}
int main(void) {
pthread_t thread1, thread2;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
pthread_create(&thread1, NULL, thread_func, (void*)1);
pthread_create(&thread2, NULL, thread_func, (void*)2);
sleep(2); // 等待一段时间
// 加锁
pthread_mutex_lock(&mutex);
// 更改条件并唤醒所有等待线程
ready = 1;
pthread_cond_broadcast(&cond);
// 解锁
pthread_mutex_unlock(&mutex);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
pthread_cond_destroy(&cond);
pthread_mutex_destroy(&mutex);
return 0;
}
在代码中,我们创建了两个线程,它们将等待条件变量`ready`变为1。当`main()`函数中将`ready`设置为1并调用`pthread_cond_broadcast`后,所有等待中的线程将被唤醒并继续执行。