目录
一、条件变量概念
条件变量是一种同步机制,通常用于线程之间的协调。在Linux系统中,条件变量通常与互斥锁一起使用,来实现线程的等待和唤醒操作。
条件变量允许一个或多个线程在满足特定条件之前等待,当条件不满足时,线程会被阻塞,直到其他线程通知该条件已满足。当条件满足时,其他线程可以通过发出信号通知条件变量,从而唤醒等待的线程。
二、条件变量作用
Linux条件变量是一种线程同步机制,用于实现线程之间的协调和通信。它允许一个线程在满足特定条件之前等待,然后在条件满足时被唤醒。
条件变量通常与互斥锁一起使用,以确保线程互斥地访问共享资源。当一个线程需要等待某个条件成立时,它可以调用条件变量的等待函数将自己挂起,然后在另一个线程修改条件并发送信号时被唤醒。
通过条件变量,线程可以更有效地进行同步和协作,避免了忙等待的情况,提高了程序的性能和效率。
三、基本操作
在Linux系统中,条件变量通常与以下函数一起使用:
- pthread_cond_init:初始化条件变量
- pthread_cond_wait:等待条件变量满足
- pthread_cond_signal:发送信号唤醒一个等待的线程
- pthread_cond_broadcast:发送信号唤醒所有等待的线程
- pthread_cond_destroy:销毁条件变量
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
pthread_cond_t cond;
pthread_mutex_t mutex;
char buff[128]={0};
//打印主线程输入的字符串
void* fun1(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("fun1 buff=%s\n",buff);
}
}
//打印主线程输入的字符串
void* fun2(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("fun2 buff=%s\n",buff);
}
}
int main()
{
pthread_cond_init(&cond,NULL);
pthread_mutex_init(&mutex,NULL);
pthread_t id1,id2;
pthread_create(&id1,NULL,fun1,NULL);
pthread_create(&id2,NULL,fun2,NULL);
while(1)
{
fgets(buff,128,stdin);
if(strncmp(buff,"end",3)==0)
{
pthread_mutex_lock(&mutex);
pthread_cond_broadcast(&cond);//唤醒所有线程
pthread_mutex_unlock(&mutex);
break;
}
else
{
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);//唤醒一个线程
pthread_mutex_unlock(&mutex);
}
}
pthread_join(id1,NULL);
pthread_join(id2,NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
exit(0);
}
pthread_mutex_t mutex:声明一个互斥锁,用于保护共享资源(如 buff)。
pthread_cond_t cond:声明一个条件变量,用于线程间的同步。
pthread_mutex_lock(&mutex):加锁,确保对共享资源的访问是线程安全的。
pthread_mutex_lock(&mutex):解锁。
条件变量必须与互斥锁一起使用,以确保对共享资源的访问是线程安全的。
两个线程不能同时操作,所以要加互斥锁,保证他俩只能有一个在等待状态。