Linux——条件变量
目录
一、概念
条件变量是一种用于多线程编程中的同步机制,它允许线程在某个条件不满足时进入等待状态,并在条件满足时被唤醒。
1.1 基本概念
如果说互斥锁是用于同步线程对共享数据的访问的话,那么条件变量就是用于在线程之间同步共享数据的值。条件变量提供了一种线程间的通知机制,当共享数据达到某个值的时候,唤醒等待这个共享数据的线程。实现条件变量必须使用互斥锁,因为互斥锁只能用于保护临界资源,而条件变量可以用来通知线程某个条件已经满足。
1.2 条件变量的作用
减少竞争:在没有条件变量的情况下,线程可能需要不断轮询某个条件是否满足,这会浪费CPU资源。条件变量允许线程在条件不满足时进入休眠状态,直到被其他线程唤醒。
线程同步:条件变量可以用来同步线程的执行顺序。例如,在生产者-消费者模型中,消费者线程可以在队列为空时等待,生产者线程在生产产品后唤醒消费者。
1.3 条件变量的使用
条件变量的使用通常涉及以下几个步骤:
初始化:可以通过静态初始化(
pthread_cond_t cond = PTHREAD_COND_INITIALIZER
)或动态初始化(pthread_cond_init()
)来创建条件变量。等待条件:线程通过
pthread_cond_wait()
函数阻塞,等待条件变量,该函数会释放互斥锁,并将线程挂起,直到被其他线程唤醒。唤醒线程:当条件满足时,eg从键盘输入数据时,其他线程可以通过
pthread_cond_signal()
唤醒一个等待的线程,或者通过pthread_cond_broadcast()
唤醒所有等待的线程。销毁:条件变量使用完毕后,可以通过
pthread_cond_destroy()
销毁。
二、基本操作
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
pthread_mutex_t mutex;
pthread_cond_t cond;//声明
char buff[128] = { 0 };//全局变量,存放键盘输入的数据
void* funa(void* arg)
{
while (1)
{
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);//阻塞
pthread_mutex_unlock(&mutex);
if (strncmp(buff, "end", 3) == 0)
{
break;
}
printf("funa read:%s\n", buff);
}
}
void* funb(void* arg)
{
while (1)
{
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);//阻塞,等着被唤醒
pthread_mutex_unlock(&mutex);
if (strncmp(buff, "end", 3) == 0)
{
break;
}
printf("funb read:%s\n", buff);
}
}
int main()
{
pthread_mutex_init(&mutex, NULL);//初始化互斥锁
pthread_cond_init(&cond, NULL);//条件变量初始化
pthread_t ida, idb;//接受俩个线程
pthread_create(&ida, NULL, funa, NULL);//启动
pthread_create(&idb, NULL, funb, NULL);
while (1)
{
fgets(buff, 128, stdin);//从键盘获取
if (strncmp(buff, "end", 3) == 0)
{
pthread_cond_broadcast(&cond);//一起唤醒俩个线程
//&cond 是条件变量的地址,表示要操作的条件变量。
break;
}
else
{
pthread_cond_signal(&cond);//只唤醒一个
}
}
pthread_join(ida, NULL);//等待俩个线程结束
pthread_join(idb, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);//销毁
exit(0);
}
pthread_mutex_t mutex
:声明一个互斥锁,用于保护共享资源(如buff
)。
pthread_cond_t cond
:声明一个条件变量,用于线程间的同步。
pthread_mutex_lock(&mutex)
:获取互斥锁,确保对共享资源的访问是线程安全的。条件变量必须与互斥锁一起使用,以确保对共享资源的访问是线程安全的。
俩个线程不能同时操作,所以要加互斥锁,保证他俩只能有一个在等待