条件变量(Condition Variables)是多线程编程中用于线程间通信的一种同步机制。它允许线程等待某个条件成立,或者通知其他线程某个条件已经成立。条件变量通常与互斥锁(Mutex)一起使用,以确保线程安全。
Linux下的条件变量主要有两种类型:
以下是一个简单的使用POSIX条件变量和互斥锁的示例,模拟生产者-消费者问题:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int count = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_full = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond_empty = PTHREAD_COND_INITIALIZER;
void* producer(void* arg) {
while (1) {
pthread_mutex_lock(&mutex);
while (count == BUFFER_SIZE) {
pthread_cond_wait(&cond_full, &mutex);
}
buffer[count++] = 1;
printf("Produced, count = %d\n", count);
pthread_cond_signal(&cond_empty);
pthread_mutex_unlock(&mutex);
sleep(1);
}
return NULL;
}
void* consumer(void* arg) {
while (1) {
pthread_mutex_lock(&mutex);
while (count == 0) {
pthread_cond_wait(&cond_empty, &mutex);
}
buffer[--count] = 0;
printf("Consumed, count = %d\n", count);
pthread_cond_signal(&cond_full);
pthread_mutex_unlock(&mutex);
sleep(1);
}
return NULL;
}
int main() {
pthread_t producer_thread, consumer_thread;
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
return 0;
}
问题:线程在等待条件变量时可能会错过信号。
原因:如果线程在检查条件和调用pthread_cond_wait
之间被调度出去,而此时另一个线程发出了信号,那么该线程可能会错过这个信号。
解决方法:使用循环检查条件,而不是单次检查。这样可以确保线程在唤醒后再次确认条件是否满足。
while (condition_not_met) {
pthread_cond_wait(&cond, &mutex);
}
通过这种方式,即使线程错过了第一次信号,它也会在下次循环中继续等待,直到条件真正满足为止。
希望这些信息对你有所帮助!如果有更多具体问题,欢迎继续提问。
领取专属 10元无门槛券
手把手带您无忧上云