【Linux】条件变量

条件等待

  • 意义:程序一执行可能不需要很多线程一起跑,需要等待某个线程执行到特定的位置后再执行另一进程,此时就需要了条件变量

基础函数

  1. 创建条件变量(必须是全局)
pthread_cond_t pcond;            //声明一个条件变量

2.条件变量初始化

pthread_cond_init(&pcond,nullptr);   //初始化条件变量
//参数1:条件变量的地址
//参数2:通常为NULL

3.条件等待

 int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
 //参数一:同上。
 //参数二 :即为锁,这个锁用来解开唤醒这个条件变量的所控制的线程,可以解开这个锁,

4.唤醒条件变量

int pthread_cond_signal(pthread_cond_t *cond); 
//参数1:条件变量地址

5.摧毁条件变量

int pthread_cond_destroy(pthread_cond_t *cond) 
//参数1:条件变量地址

案例

场景:有多个线程的前提下,某个线程不一定要一开始就执行,先进入休眠状态,直到某个线程执行到一定程度后,唤醒休眠进程继续执行,用上面的例子修改,当fun1进入休眠状态,fun2的data加到5的时候唤醒fun1进程执行以下代码

#include <stdio.h>
#include <pthread.h>

int data = 0;
pthread_mutex_t mutex; // 创建锁
pthread_cond_t con;    // 创建一个条件

void *fun1(void *arg)
{
    int i = *((int *)arg);
    printf("t1:fun1 threadid is %ld\n", (unsigned long)pthread_self());
    printf("t1:contact is %d\n", i);

    while (1)
    {
        pthread_cond_wait(&con, &mutex); // 如果先是fun1运行到这里会休眠
        if (data == 5)
        {
            printf("t1 quit===================\n");
        }
        printf("t1 = %d\n", data);
        data = 0;
        sleep(1);
    }
}

void *fun2(void *arg) // 不断的对共享资源进程修改直到满足fun1的要求从而唤醒fun1
{
    int i = *((int *)arg);
    printf("t2:fun1 threadid is %ld\n", (unsigned long)pthread_self());
    printf("t2:contact is %d\n", i);
    while (1)
    {
        printf("t2:%d\n", data);
        pthread_mutex_lock(&mutex);
        data++;
        if (data == 5)
        {
            pthread_cond_signal(&con); // 如果data等于5 就会唤醒fun1
        } 
        pthread_mutex_unlock(&mutex);
        sleep(1);
    }
}

int main()
{
    pthread_t t1; // 进程号
    pthread_t t2; // 进程号

    int ret;
    int param = 100; // 线程调用的函数需要的传递的参数

    pthread_mutex_init(&mutex, NULL); // 初始化锁
    pthread_cond_init(&con, NULL);    // 初始化条件

    ret = pthread_create(&t1, NULL, fun1, &param);
    if (ret == 0)
    {
        //printf("main:create success!\n");
    }

    ret = pthread_create(&t2, NULL, fun2, &param);
    if (ret == 0)
    {
        //printf("main:create success!\n");
    }
    printf("main:%ld\n", (unsigned long)pthread_self());

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    pthread_mutex_destroy(&mutex);//销毁锁
    pthread_cond_destroy(&con); //销毁条件变量
    return 0;
}

运行结果:
在这里插入图片描述

通过代码我们可以看到,这个对于data的访问一定格式线程2先访问完之后,再唤醒线程1去对公共变量data的访问控制,实现的比较灵活,在实际工作中具有重要意义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值