linux多线程之条件变量
目录
条件变量基本原理
初始化条件变量:pthread_cond_init
等待条件变量 :pthread_cond_wait
唤醒所有等待线程:pthread_cond_broadcast
销毁条件变量:pthread_cond_destroy
示例代码
条件变量基本原理
条件变量(Condition Variable)是多线程编程中用于线程同步的一种机制,它允许线程在某个条件满足时被唤醒。
条件变量通常与互斥锁配合使用。线程在检查某个条件是否满足之前,先获取互斥锁以保护共享资源。如果条件不满足,线程会释放互斥锁并在条件变量上等待。当其他线程修改了共享资源使得条件满足时,它会通知在该条件变量上等待的线程。等待的线程被唤醒后,会重新获取互斥锁,然后检查条件是否真的满足(因为可能存在虚假唤醒,即线程被唤醒但条件实际上并未满足)。
初始化条件变量:pthread_cond_init
- 函数原型:
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
- 功能:初始化一个条件变量。
- 参数:
cond
:指向要初始化的条件变量的指针。attr
:用于指定条件变量的属性,通常设为NULL
使用默认属性。
- 返回值:成功时返回 0,失败时返回非零错误码。
等待条件变量 :pthread_cond_wait
- 函数原型:
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
- 功能:使调用线程在条件变量
cond
上等待。调用该函数前,线程必须已经获取了互斥锁mutex
。函数会自动释放互斥锁,并将线程置于等待状态,直到条件变量被其他线程通过pthread_cond_signal
或pthread_cond_broadcast
唤醒。唤醒后,线程会重新获取互斥锁。 - 参数:
cond
:指向要等待的条件变量的指针。mutex
:指向与条件变量关联的互斥锁的指针。
- 返回值:成功时返回 0,失败时返回非零错误码。
唤醒一个等待线程:pthread_cond_signal
- 函数原型:
int pthread_cond_signal(pthread_cond_t *cond);
- 功能:唤醒在条件变量
cond
上等待的一个线程。如果有多个线程在等待,具体唤醒哪个线程是由系统决定的。 - 参数:
cond
:指向要操作的条件变量的指针。 - 返回值:成功时返回 0,失败时返回非零错误码。
唤醒所有等待线程:pthread_cond_broadcast
- 函数原型:
int pthread_cond_broadcast(pthread_cond_t *cond);
- 在条件变量
cond
上等待的所有线程。 - 参数:
cond
:指向要操作的条件变量的指针。 - 返回值:成功时返回 0,失败时返回非零错误码。
销毁条件变量:pthread_cond_destroy
- 函数原型:
int pthread_cond_destroy(pthread_cond_t *cond);
- 功能:销毁一个已初始化的条件变量,释放相关资源。在销毁条件变量之前,应确保没有线程在该条件变量上等待。
- 参数:
cond
:指向要销毁的条件变量的指针。 - 返回值:成功时返回 0,失败时返回非零错误码。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int ready = 0;void* waiter(void* arg) {pthread_mutex_lock(&mutex);while (!ready) {printf("Waiting for condition...\n");pthread_cond_wait(&cond, &mutex);}printf("Condition met. Continuing...\n");pthread_mutex_unlock(&mutex);return NULL;
}void* signaler(void* arg) {pthread_mutex_lock(&mutex);ready = 1;printf("Setting condition...\n");pthread_cond_signal(&cond);pthread_mutex_unlock(&mutex);return NULL;
}int main() {pthread_t thread1, thread2;pthread_create(&thread1, NULL, waiter, NULL);pthread_create(&thread2, NULL, signaler, NULL);pthread_join(thread1, NULL);pthread_join(thread2, NULL);pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);return 0;
}
代码说明:
waiter
线程获取互斥锁后,检查ready
条件。如果ready
为 0,它会调用pthread_cond_wait
等待条件变量,并释放互斥锁。signaler
线程获取互斥锁,设置ready
为 1,然后调用pthread_cond_signal
唤醒waiter
线程,最后释放互斥锁。waiter
线程被唤醒后,重新获取互斥锁,检查ready
条件,发现条件满足后继续执行。最后,主线程等待两个线程完成,并销毁互斥锁和条件变量。