`
chriszeng87
  • 浏览: 741741 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

posix 条件变量

阅读更多

条件变量是一中线程同步机制,需要和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;

}

 

转自:http://blog.csdn.net/hengshan/article/details/6607616

分享到:
评论

相关推荐

    5. 通知状态的改变—POSIX条件变量1

    POSIX条件变量是一种机制,允许线程在特定条件满足时才继续执行,从而有效地协调线程间的协作。这种机制通常与互斥量结合使用,以实现高效、低开销的同步。 **条件变量的作用:** 条件变量允许一个线程等待某个共享...

    互斥锁与条件变量详解 疑问全解

    互斥锁与条件变量详解 互斥锁(Mutex)是多线程编程中最基本的同步机制之一,它用于保护共享资源免受多个线程同时访问的干扰。条件变量(Condition Variable)则是另一个重要的同步机制,它允许线程在满足特定条件...

    操作系统思考电子书阅读

    条件变量是操作系统中的一种基本概念,Downey 在书籍中详细解释了POSIX条件变量和生产者/消费者问题。 信号量 信号量是操作系统中的一种基本概念,Downey 在书籍中详细解释了POSIX信号量和C中的实现。 操作系统...

    C++教程网《Linux网络编程》视频百度云地址

    Linux网络编程(总共41集) ...40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现 网络编程, Linux

    多线程编程指南

    NSCondition类和POSIX条件变量提供了在多线程环境中优雅地处理线程间依赖性的手段。 #### 结论 多线程编程是一项复杂但至关重要的技能,掌握其原理和实践技巧,能够显著提升软件的性能和用户体验。通过深入理解...

    c++教程网的linux网络编程视频下载

    教程非常不错,价值280元,绝对是...40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现 网络编程, Linux, 密码

    2018年C++教程网的linux网络编程视频共41集百度云下载链接.rar

    Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章...40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现

    Linux网络编程 视频 教程

    Linux网络编程(总共41集) ...40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现 网络编程, Linux

    [免费]2018年C++教程网的linux网络编程视频百度云下载链接.rar

    教程非常不错,价值280元,绝对是...40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现 网络编程, Linux, 密码

    linux条件变量简单讲解.pdf

    在Linux多线程编程中,条件变量是一种同步机制,允许线程等待某个条件成立。条件变量通常与互斥锁(mutex)一起使用,以避免竞争条件(Race Condition)和确保线程间的同步。本篇讲解将详细介绍Linux条件变量的基本...

    Linux系统编程-(pthread)线程通信(条件变量).pdf

    在多线程编程中,线程间的通信是非常重要的,条件变量(Condition Variables)是POSIX线程(pthread)库提供的一种同步机制,它允许线程在特定条件满足时才能继续执行。在Linux系统编程中,条件变量通常与互斥锁...

    C++教程网视频:linux网络编程

    ##### POSIX条件变量 - **条件变量**:用于线程间的同步。 - **条件变量函数**:创建、销毁、等待、广播条件变量的函数。 - **条件变量使用规范**:正确使用条件变量的准则。 - **使用条件变量解决生产者消费者问题...

    linux线程专题笔记.docx

    POSIX条件变量** - **初始化**: 使用`pthread_cond_init()`初始化条件变量。 - **等待**: 使用`pthread_cond_wait()`使线程等待。 - **信号**: 使用`pthread_cond_signal()`唤醒等待的线程。 **4. 综合案例** ...

    analysis of ACE_Task-putq with timeout=0 when queue is full on Linux platform.pdf

    - 映射到POSIX条件变量等待接口。 6. **`__pthread_cond_wait`**: - glibc内部实现,用于等待条件变量。 7. **`lll_futex_wait`** 和 **`lll_futex_timed_wait`**: - glibc内部实现,用于等待futex条件。 8....

    POSIX Threads Programming.pdf

    - **等待和信号条件变量**:`pthread_cond_wait()`和`pthread_cond_signal()`函数用于等待条件变量和向等待的线程发送信号。 #### 三、LLNL特定信息和推荐 文档还提到了Lawrence Livermore National Laboratory...

    并行计算 + Posix

    5. **负载均衡与同步**:讲解如何确保资源的有效分配,避免死锁和饥饿,并实现高效的同步策略,如锁、信号量和条件变量。 **Posix** POSIX(Portable Operating System Interface for UNIX)是一组国际标准,定义...

    posix 接口 入门资料

    内容可能涵盖线程的创建、同步、互斥锁、条件变量等概念,是理解并实践多线程编程的关键。 《POSIX.CHM》:这是一个关于POSIX标准的CHM(Compiled HTML Help)文档,通常包含详细的API参考,涵盖了POSIX接口的各种...

    OS大作业生产者消费者同步问题的实现

    本大作业旨在让学生理解并熟练运用POSIX提供的同步机制,特别是互斥锁和条件变量,来解决这个问题。以下是相关知识点的详细说明: 1. **互斥锁**:在多线程环境中,互斥锁用于保护共享资源,确保同一时间只有一个...

    POSIX Threads Programming

    通过以上内容,我们不仅了解了 Pthreads 的基本概念和功能,还深入学习了如何使用 Pthreads 进行线程管理、同步以及如何利用 Mutex 和条件变量解决多线程环境下的常见问题。这对于软件开发者来说是非常宝贵的资源,...

Global site tag (gtag.js) - Google Analytics