zoukankan      html  css  js  c++  java
  • 条件变量实现事件的正确使用姿势


    // Interface of Waiter, also takes care of mutex_ & cond_ init and destroy.
    class Waiter : boost::noncopyable
    {
    public:
    virtual void wait() = 0;
    virtual void signal() = 0;

    protected:
    Waiter()
    {
    pthread_mutex_init(&mutex_, NULL);
    pthread_cond_init(&cond_, NULL);
    }

    ~Waiter()
    {
    pthread_mutex_destroy(&mutex_);
    pthread_cond_destroy(&cond_);
    }

    pthread_mutex_t mutex_;
    pthread_cond_t cond_;
    };

    // Version 7: broadcast to wakeup multiple waiting threads
    // Probably the best version among above.
    class Waiter7 : public Waiter
    {
    public:
    void wait() override
    {
    pthread_mutex_lock(&mutex_);
    while (!signaled_)
    {
    pthread_cond_wait(&cond_, &mutex_);
    }
    pthread_mutex_unlock(&mutex_);
    }

    void signal() override // Sorry, bad name in base class, poor OOP
    {
    broadcast();
    }

    void broadcast()
    {
    pthread_mutex_lock(&mutex_);
    pthread_cond_broadcast(&cond_);
    signaled_ = true;
    pthread_mutex_unlock(&mutex_);
    }

    private:
    bool signaled_ = false;
    };

  • 相关阅读:
    HDU 1269 迷宫城堡 tarjan算法求强连通分量
    hrbust 1721 A + B = 0 map的应用
    关于vis标记
    poj 1703
    poj1961 kmp
    acm poj1260 dp
    矩阵链乘 hrbust 1600
    单源最短路径 hdu 2066
    最小生成树
    多维背包 hrbudt 1335 算法与追MM
  • 原文地址:https://www.cnblogs.com/lidabo/p/11423706.html
Copyright © 2011-2022 走看看