条件变量是一中线程同步机制,需要和pthread_mutex_t配合使用才能完成任务,典型的可以应用在“生产者、消费者”模型中。
条件变量的数据类型:pthread_cond_t
配合的函数有:
1、pthread_cond_t结构的初始化、销毁函数
#include <pthread.h> int pthread_cond_init(pthread_cond_t *restrict cond, pthread_condattr_t *restrict attr); int pthread_cond_destroy(pthread_cond_t *cond);
|
Both return: 0 if OK, error number on failure |
2、获取条件变量的函数
#include <pthread.h> int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex); int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict timeout);
|
Both return: 0 if OK, error number on failure |
3、唤醒在条件变量上阻塞的函
#include <pthread.h> int pthread_cond_signal(pthread_cond_t *cond); int pthread_cond_broadcast(pthread_cond_t *cond);
|
Both return: 0 if OK, error number on failure |
举例:
如果我们有一个不限制长度的队列,有多个线程向队列写入数据,有多个线程从队列读取数据。要求:1 同时只有一个线程操作对联。2如果队列没有数据,读取线程需要等待。3 写队列线程,写入数据后通知等待数据的线程。
我们可以用下面的代码实现:
队列使用的要点:
1、必须要用pthread_mutex_t保护队列
2、用条件变量实现,等待、通知的功能
3、条件等待的判断条件必须是while,防止spurious awaken.如get_msg函数中的红色部分。
在代码中,用蓝色注释,解释条件变量使用,发生的事情。
struct data_block * get_msg(struct message_queue *mq)
{
struct data_block *db = NULL;
pthread_mutex_lock(&mq->lock);//获取mq->lock锁 ,保护下面队列为空的判断
while(mb_empty(&mq->message_block))
pthread_cond_wait(&mq->cond , &mq->lock);//释放mq->lock锁,获取mq->cond条件,线程阻塞。当写队列的线程发送signal信号的时候,获取mq->lock锁,释放mq->cond。
db = mb_pop_front(&mq->message_block);
pthread_mutex_unlock(&mq->lock);//最后释放mq->lock锁
return db;
}
int put_msg(struct message_queue *mq , struct data_block *db)
{
pthread_mutex_lock(&mq->lock); //获取mq->lock锁 ,保护下面队列操作
int errn = mb_push_back(db , &mq->message_block); pthread_metex_unlock(&mq->lock); //最后释放mq->lock锁
pthread_cond_signal(&mq->cond);//通知阻塞在mq->cond的线程
return errn;
}
相关推荐
5. 通知状态的改变—POSIX条件变量1
操作系统实践大作业:使用POSIX条件变量和互斥锁实现生产者、消费者同步问题,缓冲区空时消费者不能消费,当有生产者生产产品后唤醒阻塞的消费者;缓冲区满时生产者不能生产,当有消费者消费产品后唤醒阻塞的生产者...
Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 ...40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现
Linux网络编程(总共41集) ...40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现 网络编程, Linux
教程非常不错,价值280元,绝对是...40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现 网络编程, Linux, 密码
Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章...40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现
Linux网络编程(总共41集) ...40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现 网络编程, Linux
Linux网络编程(总共41集) ...40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现 网络编程, Linux, 密码
教程非常不错,价值280元,绝对是...40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现 网络编程, Linux, 密码
Linux C 开发 线程通信 POSIX 条件变量 互斥
小事 pevents是一个跨平台的低级库,旨在为POSIX系统提供WIN32事件的实现。 pevents是建立在并行线程,并提供最两者手册-和自动重置事件的功能在Windows...尽管POSIX条件变量( pthread_cond_t )和WIN32事件均提供了编
Posix多线程编程学习笔记1~6,包括线程基础,线程属性,信号灯,条件变量,互斥变量,共享内存六部分内容。很有助于linux下多线程的开发。文档主要包含介绍相应的pthread接口函数,并举了部分相应的例子。
在整理基础知识点的过程中,对诸如 CFS-vruntime、POSIX 条件变量、TCP 和 epoll 等内容有了自己的理解,有一种恍然大悟的感觉。之所以使用 XMind 来记录这些内容,是因为我非常喜欢《火星救援》里面的一句台词:有...
POSIX 对于才开始接触Linux系统的新手,对线程创建线程间通信
Posix-Thread-UI 简单的示例代码演示了几个 Pthread 条件变量例程的使用。 主例程创建三个线程。 其中两个线程执行工作并更新“计数”变量。 第三个线程等待,直到计数变量达到指定值。 参考: :
注意将bin目录添加到系统path环境变量。 C语言编译必备,用起来很方便 3.1:MinGW 是什么? MinGW 提供了一套简单方便的Windows下的基于GCC 程序开发环境。MinGW 收集了一系列免费的Windows 使用的头文件和库文件...
四、条件变量与互斥锁、信号量的区别 55 第六章 共享内存 56 一、什么是共享内存区 56 二、mmap 56 三、posix共享内存函数 60 四、ftruncate和fstat函数 62 五、共享内存区的写入和读出 64 六、程序例子 65
四、条件变量与互斥锁、信号量的区别 55 第六章 共享内存 56 一、什么是共享内存区 56 二、mmap 56 三、posix共享内存函数 60 四、ftruncate和fstat函数 62 五、共享内存区的写入和读出 64 六、程序例子 65
从入门到深入的讲解了C++ 语言在网络编程中的应用范围和使用方法