线程同步——条件变量

发布于:2025-05-01 ⋅ 阅读:(15) ⋅ 点赞:(0)

目录

一、条件变量概念

二、条件变量作用

三、基本操作


一、条件变量概念

条件变量是一种同步机制,通常用于线程之间的协调。在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):解锁。

条件变量必须与互斥锁一起使用,以确保对共享资源的访问是线程安全的。

两个线程不能同时操作,所以要加互斥锁,保证他俩只能有一个在等待状态。


网站公告

今日签到

点亮在社区的每一天
去签到