`
konin
  • 浏览: 10246 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

信号量Condition

阅读更多

前面有说道过互斥,互斥是异步的时候使用的,就是说,在资源的使用上,我用,你就不能用,我用完了你才可以用,没有逻辑上的相关性,而信号呢,是同步的时候用的,就是说这个步骤我做完了,需要下一个步骤开始了,我做完了通知你,你来处理下一步,有着逻辑上的相关性

 

声明:

class Condition : public NonCopyable {

public:

    /**

     * 构造函数

     */

    Condition(Mutex& mutex);

    

    /**

     * 释放函数

     */

    virtual ~Condition();

    

    /**

     * 等待, 会先释放锁再休眠, 被通知后再重新获取锁

     */

    void wait();

    

    /**

     * 尝试等待

     * @param timeout 超时绝对时间

     */

    bool tryWait(const TimeValue& timeout);

    

    /**

     * 通知一个等待线程

     */

    void signal();

    

    /**

     * 通知所有等待线程

     */

    void broadcast();

    

private:

 

    pthread_cond_t  _cond;

    Mutex&       _mutex;

};

 

实现:

 

 

Condition::Condition(Mutex& mutex) : _mutex(mutex) {

    int rc = pthread_cond_init(&_cond, 0);

    if (rc) {

        throw SynchException(rc);

    }

}

 

Condition::~Condition() {

    int rc = pthread_cond_destroy(&_cond);

    if (rc) {

        cerr << "Failed to destroy condition: " << SynchException::toString(rc) << endl;

    }

}

 

void Condition::wait() {

    int rc = pthread_cond_wait(&_cond, &(_mutex._mutex));

    if (rc) {

        throw SynchException(rc);

    }

}

 

bool Condition::tryWait(const TimeValue& timeout) {

    struct timespec absTime;

    absTime.tv_sec = static_cast<time_t>(timeout.toSeconds());

    absTime.tv_nsec = static_cast<long>((timeout.toMicroSeconds() % 1000000) * 1000);

    int rc = pthread_cond_timedwait(&_cond, &(_mutex._mutex), &absTime);

    if (rc && rc != ETIMEDOUT) {

        throw SynchException(rc);

    }

    return rc != ETIMEDOUT;

}

 

void Condition::signal() {

    int rc = pthread_cond_signal(&_cond);

    if (rc) {

        throw SynchException(rc);

    }

}

 

void Condition::broadcast() {

    int rc = pthread_cond_broadcast(&_cond);

    if (rc) {

        throw SynchException(rc);

    }

}

 

使用方法:

    void add(T inputItem) {

        while (_highWaterMark > 0 && _queue.size() >= _highWaterMark) {

            _highCond.wait();//队列元素过多,等待处理,信号等待

        }

        _queue.push_back(inputItem);

        _lowCond.signal();//队列元素push后,通知

    }

 

上面着段代码在我的博客另外一篇文章中有。

分享到:
评论

相关推荐

    哈工大软件学院操作系统实验4——信号量的实现和应用

    例如,可以使用互斥锁(mutex)来实现二进制信号量,或者使用条件变量(condition variable)和自旋锁(spinlock)来实现更复杂的计数信号量。 实验的具体任务可能包括以下几个方面: 1. **信号量初始化**:初始化...

    qt5多线程,信号量,互斥量,等待条件

    本文将详细探讨如何利用QT5的线程机制,以及信号量(Semaphore)、互斥量(Mutex)和等待条件(Condition Variable)等同步原语,来构建一个高效的生产者-消费者模型。 首先,我们要理解线程的基本概念。线程是程序...

    使用信号量进行多任务同步

    信号量有两种类型:二进制信号量和计数信号量。 1. **二进制信号量**:二进制信号量只有两种状态,即“有”和“无”,可以理解为一个开关,0表示无资源,1表示有资源。当资源被占用时,信号量值变为0,其他任务试图...

    Delphi线程同步(临界区、互斥、信号量).pdf

    本文将重点介绍三种常见的同步机制:临界区、互斥量和信号量,并通过示例代码帮助理解它们的工作原理及应用场景。 #### 二、临界区(Critical Section) 临界区是最简单的线程同步方式之一,适用于同一进程中的...

    信号量小书.........

    ### 信号量小书知识点概览 #### 一、书籍基本信息 - **书名**:《信号量小书》(The Little Book of Semaphores) - **作者**:Allen B. Downey - **版本**:第二版 - **版权**:本书遵循GNU自由文档许可证1.1或更...

    多线程 教程 各种锁 半成品的CAS 临界区 信号量 事件 互斥锁 队列

    本教程将深入探讨多线程相关的知识点,包括各种锁机制、条件变量、半成品的CAS操作、临界区、信号量、事件、互斥锁以及队列。 **多线程**:多线程是操作系统提供的一种并发执行机制,一个进程可以包含多个线程,每...

    互斥锁、条件变量、信号量总结

    互斥锁、条件变量和信号量是操作系统中用于线程同步和资源管理的重要工具,尤其在多线程和多进程编程中发挥着关键作用。这些机制确保了共享资源的有序访问,防止数据竞争和死锁等问题的发生。 首先,互斥锁(Mutex...

    第三十一章-信号量1

    而在Mac上,由于不支持内建的信号量,需要使用锁(Mutex)和条件变量(Condition Variable)自定义实现信号量。 在编程作业中,`Makefile`提供了编译指令,如`FLAGS`包含`-Wall`显示所有警告,`-pthread`启用多线程...

    线程同步(信号量,互斥,条件变量)

    信号量可以分为二进制信号量(类似于互斥量,只能为0或1,表示资源是否可用)和计数信号量(可设置任意非负整数值,表示资源的数量)。`sem_open()`, `sem_wait()`, `sem_post()` 和 `sem_close()` 是常用的信号量...

    信号量PV操作例题李白杜甫下棋.zip

    在C++中,我们可以使用`std::mutex`和`std::condition_variable`来实现信号量,或者使用第三方库如Boost库中的`boost::semaphore`。线程间的同步可以借助`std::unique_lock`和`std::condition_variable::wait()`、`...

    mutexes-variables-semaphores.rar_linux 线程锁_mutexes_锁和信号量

    在Linux系统中,多线程编程是实现并发执行的关键技术,而互斥锁(mutexes)、条件变量(condition variables)和信号量(semaphores)是确保线程安全和资源同步的重要工具。以下是对这些概念的详细解释: 1. 互斥锁...

    基于Boost的数据处理器及线程安全类和信号量

    2. 封装了boost的condition_variable,使其使用方法很接近Windows的Event。其优势在于能跨平台使用。 3. 封装了boost的mutex,能跨平台使用。 4. 封装了boost的mutex的scoped_lock,能跨平台使用。相对于CWnLock,其...

    操作系统_生产者/消费者问题

    操作系统中的生产者/消费者问题是多线程编程中的一个经典示例,它展示了如何通过同步机制来协调并发...文件“信号量Win32”和“信号量Pthread”很可能是分别演示了在两个平台上如何用C或C++代码实现这一问题的实例。

    ecos系统同步原语

    - 信号量用于控制对有限资源的访问数量,可以是计数信号量或二进制信号量。计数信号量允许多个线程同时访问,而二进制信号量类似于互斥体,只允许一个线程访问。`cyg_semaphore_create()`用于创建信号量,`cyg_...

    OS_31:信号量,PV操作,线程

    操作系统中的信号量、PV操作和线程是并发编程中的核心概念,它们对于理解和实现多任务环境下的资源管理和同步至关重要。在此,我们将深入探讨这些概念及其在C语言编程中的应用。 首先,信号量(Semaphore)是一种...

    little_book_of_semaphore,带目录完全版

    此外,信号量还与诸多高级同步机制紧密相关,比如监视器(monitors)和条件变量(condition variables)。监视器是一种用于提供线程安全的封装机制,它能够控制对对象的同步访问,而条件变量则为线程提供了等待和...

    哈工大操作系统-L17对信号量的临界区保护1

    首先,当多个进程共同修改共享的信号量时,可能会出现竞态条件(Race Condition),即由于进程调度的不确定性导致的共享数据错误。为了解决这个问题,引入了临界区和原子操作的概念。临界区是指进程中访问共享资源的...

    OS-p3:使用信号量实现监视器

    不过,我们可以利用`std::mutex`来模拟互斥信号量,并结合`std::condition_variable`来实现计数信号量。`std::mutex`提供了一种互斥锁,确保同一时刻只有一个线程能持有锁,而`std::condition_variable`则允许线程在...

    Linux中的semaphore和rwsem .pdf

    2. 信号量通常用于实现互斥锁(mutual exclusion)和条件变量(condition variable)。 3. 信号量有两种类型:二进制信号量(只能取0或1)和计数信号量(可以取多个值)。 4. Linux内核提供了一个叫semaphore的抽象...

    生产者-消费者问题的Win32实现

    这个问题的解决通常涉及线程同步机制,如互斥量(Mutex)、信号量(Semaphore)或条件变量(Condition Variable)。 在Windows操作系统环境下,我们可以利用Win32 API提供的线程同步功能来实现生产者-消费者问题。...

Global site tag (gtag.js) - Google Analytics