Linux学习——条件变量

一.条件变量

阻塞线程
不是什么时候都能阻塞线程

链表头节点
Node*head = NULL;
while(head == NULL)
{
//我们想让代码在这个位置阻塞
//等待链表中有了节点之后再继续向下运行
//使用到了后面要讲的条件变量‐阻塞线程
}
//链表不为空的处理代码
xxxx

1.条件变量是锁吗?

        不是锁,但是条件变量能够阻塞线程
        使用条件变量+互斥量
                互斥量:保护一块共享数据
                条件变量:引起阻塞
                        生产者和消费者模型

2.条件变量的两个动作

条件不满足,阻塞线程
当条件满足,通知阻塞的线程开始工作

3.条件变量的类型

pthread_cond_t cond ;
conditon 条件

4.主要函数

初始化一个条件变量
        pthread_cond_init(pthread_cond_t * restrict cond,
        const pthread_condattr_t * restrict attr
        );


销毁一个条件变量
        pthread_cond_destroy(pthread_cond_t * cond);

阻塞等待一个条件变量
        pthread_cond_wait(
        pthread_cond_t *restrict cond,
        pthread_mutex_t * restrict mutex  /互斥锁
        );
        阻塞线程
        将已经上锁的mutex解锁
        该函数解除阻塞,对互斥锁加锁

 限时等待一个条件变量
        pthread_cond_timedwait(
        pthread_cond_t * restrict cond,
        pthread_mutex_t * restrict mutex,
        const struct timespec * restrict abstime
        );


唤醒至少一个阻塞在条件变量上的线程
        pthread_cond_signal(pthread_cond_t* cond);


唤醒全部阻塞在条件变量上的线程
        pthread_cond_broadcast(pthread_cond_t * cond);

二.练习


使用条件变量实现生产者,消费者模型

Linux学习——条件变量_第1张图片

int result[2];
int* result = (int*)malloc(2 * sizeof(int));
为什么不直接使用int定义,而是使用malloc函数来申请内存?

malloc更加灵活 

使用动态内存分配(malloc)来分配内存,是一种在C语言中动态创建数组的方法,这在某些情况下可能会更加灵活。但如果知道数组大小固定为2且不会改变,也可以直接定义一个静态数组。

动态数组与静态数组之分。在相应的功能函数中更推荐使用malloc来定义长度不确定的动态数组。可以使用定义一个int * size变量来确定malloc申请的空间的大小,从而提高内存利用率。


 Linux学习——条件变量_第2张图片Linux学习——条件变量_第3张图片

Linux学习——条件变量_第4张图片

你可能感兴趣的:(Linux课程学习,学习,java,开发语言)