C++多线程实现

互斥锁

std::unique_lock:接管mutex互斥锁,离开作用域时自动解锁

std::condition_variable:使用它的wait和notify_all函数。

wait:TRUE:直接往下执行。

false:

  1. 释放锁,允许其他位置上锁,并陷入阻塞状态。

  1. 等待其他位置执行notify_all唤醒该线程。

  1. 唤醒后,立刻上锁,往下执行。

#include <condition_variable>
#include <mutex>
#include <deque>

// FIXME: double check
template <typename T> class channel
{
  public:
    channel(int buffer_size) :buffer_size(buffer_size) {}

    T get()
    {
        // std::lock_guard<std::mutex> _(mu);
        std::unique_lock<std::mutex> lk(mu);    // 上锁,使得put阻塞
        /*  参数为false:此时buffer中没有数据,需要等待直到buffer有数据再向下进行.
                1. 释放锁mu
                2. 等待其他其他线程调用notify_one或notify_all
                3. 一旦调用就唤醒了当前线程,重新对mu上锁,往下执行
            参数为true:不做任何操作等待,直接往下进行
            功能:确保了在buffer有数据时读取数据,无数据时等待buffer压入数据后再读取数据*/
        cv.wait(lk, [&]() { return buffer.size() > 0; });

        const T x = buffer.front();
        buffer.pop_front();

        // lk.unlock();
        cv.notify_all();

        return x;
    }

    void put(T x)
    {
        // std::lock_guard<std::mutex> _(mu);
        std::unique_lock<std::mutex> lk(mu);
//        cv.wait(lk, [&]() { return buffer.size() < buffer_size; });//为了读取视频
//        std::cout<<buffer_size<<std::endl;
        if(buffer.size()<buffer_size)
            buffer.push_back(x);
        else
        {

            buffer.clear();
            buffer.push_back(x);
        }

        // lk.unlock();
        cv.notify_all();
    }

  private:
    std::mutex mu;//互斥锁(英语:英语:Mutual exclusion,缩写 Mutex)是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制。
    std::deque<T> buffer;
    const int buffer_size;
    std::condition_variable cv;//当 std::condition_variable 对象的某个 wait 函数被调用的时候,
    //它使用 std::unique_lock(通过 std::mutex) 来锁住当前线程。当前线程会一直被阻塞,直到另外一个线程在相同的 std::condition_variable 对象上调用了 notification 函数来唤醒当前线程。
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐先生的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值