信号变量
条件本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。
使用互斥量保护共享数据
使用条件变量可以使线程阻塞, 等待某个条件的发生, 当条件满足的时候解除阻塞
条件变量的两个动作:
条件不满足,线程阻塞
条件满足,通知阻塞的线程解除阻塞, 开始工作。
条件变量相关函数
pthread_cond_t cond;
定义一个条件变量
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
函数描述:
初始化条件变量
函数参数
cond:条件变量
attr:条件变量属性, 通常传NULL
函数返回值:成功返回0,错误返回错误号
int pthread_cond_destroy(pthread_cond_t *cond);
销毁条件变量
int pthread_cond_wait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex);
函数描述:
条件不满足,引起线程阻塞并解锁
条件满足,解除线程阻塞,并加锁
函数参数:
cond: 条件变量
mutex: 互斥锁变量
函数返回值:成功返回0,错误返回错误号
int pthread_cond_signal(pthread_cond_t *cond);
函数描述:
唤醒至少一个阻塞在该条件变量上的线程
函数参数:
条件变量–>cond
函数返回值: 成功返回0, 失败返回错误号
//使用条件变量实现生产者和消费者模型
/*
用链表模仿生产者和消费者
生产者:向链表中插入节点
消费者:从链表中读取节点,同时将该节点销毁
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/typ