操作系统条件变量

条件变量

条件变量是利用线程间共享的"全局变量"进行同步的一种机制,主要包括两个动作:

1、线程等待"条件变量的条件成立"而休眠;

2、等"条件成立"叫醒休眠的线程。

为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起,一般线程睡入条件变量,伴随着解锁动作,而线程从条件变量醒来时,伴随着加锁动作,如果加锁失败线程进入阻塞状态,而不是睡眠。

// 定义或创建条件变量
pthread_cond_t cond;
​
// 初始化条件变量
int pthread_cond_init (pthread_cond_t* cond,const pthread_condattr_t* attr);
//亦可pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
​
// 使调用线程睡入条件变量cond,同时释放互斥锁mutex
int pthread_cond_wait (pthread_cond_t* cond,pthread_mutex_t* mutex);
​
// 带倒计时的睡眠,时间到了会自动醒来
int pthread_cond_timedwait (pthread_cond_t* cond,
    pthread_mutex_t* mutex,
    const struct timespec* abstime);
​
struct timespec {
    time_t tv_sec;  // Seconds
    long   tv_nsec; // Nanoseconds [0 - 999999999]
};
​
// 从条件变量cond中叫醒一个线程,令其重新获得原先的互斥锁
int pthread_cond_signal (pthread_cond_t* cond);
注意:被唤出的线程此刻将从pthread_cond_wait函数中返回,
但如果该线程无法获得原先的锁,则会继续阻塞在加锁上。
​
// 从条件变量cond中唤醒所有线程
int pthread_cond_broadcast (pthread_cond_t* cond);
​
// 销毁条件变量
int pthread_cond_destroy (pthread_cond_t* cond);

注意:使用互斥锁配合条件变量实现的生产者与消费者模型,能够平衡生产与消费的时间不协调,并且可以最大限度的节约运行资源。

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
​
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
​
void* run(void* arg)
{
    int index = 1;
    for(;;)
    {
        pthread_mutex_lock(&mutex);
​
        if(0 == index % 10)
        {
            printf("任务已完成,即将睡眠!\n");
            pthread_cond_wait(&cond,&mutex);
        }
​
        printf("index = %d\n",index++);
        sleep(1);
        pthread_mutex_unlock(&mutex);
    }
}
​
int main(int argc,const char* argv[])
{
    pthread_t tid;
    pthread_create(&tid,NULL,run,NULL);
​
    printf("是否叫醒睡眠的线程?");
    for(;;)
    {
        char cmd = getchar();
        if('y' == cmd)
        {
            pthread_cond_signal(&cond);
        }
    }
    pthread_join(tid,NULL);
    return 0;
}

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
条件变量是一种在多线程环境下进行同步和通信的机制。在 Linux 操作系统中,条件变量是通过 pthread 库提供的。 pthread 库中定义了 pthread_cond_t 类型,表示条件变量条件变量需要与互斥锁一起使用,以保证线程间的同步和互斥访问。 条件变量的基本操作包括: 1. pthread_cond_init:初始化条件变量。 2. pthread_cond_wait:线程等待条件变量满足。 3. pthread_cond_signal:唤醒等待条件变量的一个线程。 4. pthread_cond_broadcast:唤醒等待条件变量的所有线程。 5. pthread_cond_destroy:销毁条件变量。 使用条件变量时,一般的模式是在等待条件变量的线程中加锁,然后等待条件变量满足,在满足条件后解锁。唤醒线程时,先加锁,再改变条件变量的状态,然后解锁。 例如,一个生产者-消费者问题可以使用条件变量来实现。生产者和消费者共享一个缓冲区,生产者负责向缓冲区中写入数据,消费者负责从缓冲区中读取数据。当缓冲区为空时,消费者需要等待生产者向缓冲区中写入数据;当缓冲区满时,生产者需要等待消费者从缓冲区中读取数据。 在这种情况下,可以使用一个互斥锁来保护缓冲区的访问,使用两个条件变量来表示缓冲区的状态,一个表示缓冲区是否为空,一个表示缓冲区是否已满。生产者在向缓冲区写入数据时,如果缓冲区已满,则等待“缓冲区不满”条件变量;消费者在从缓冲区读取数据时,如果缓冲区为空,则等待“缓冲区不空”条件变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值