Leetcode刷题笔记题解(C++):1117. H2O 生成(多线程)

思路:

解法二:生产者-消费者解法
1.把 hydrogen 线程看作生产者,oxygen 线程看作消费者,缓冲队列大小为2。
2.hydrogen 把生成的氢放入队列;oxygen 线程每次从队列里消费两个氢元素。
3.生产者生产两个氢元素后会因为缓冲队列满而阻塞,使用条件变量使生产者阻塞。
4.消费者只有当缓冲队列满时才会从缓冲队列中消费元素,缓冲队列未满时消费者阻塞。
5.当生产者生成的氢元素填满缓冲队列时,生产者唤醒被阻塞的消费者;当消费者消费掉缓冲队列的元素后,消费者唤醒被阻塞的生产者。
6.由于不需要对队列中的氢元素做操作,我们只需维护缓冲队列的大小即可。

class H2O {
public:
    mutex mtx;
    condition_variable cv;
    int cnt_h;
    H2O() {
        
    }

    void hydrogen(function<void()> releaseHydrogen) {
        unique_lock<mutex> lock(mtx);
        cv.wait(lock,[this]{return this->cnt_h<2;});
        // releaseHydrogen() outputs "H". Do not change or remove this line.
        releaseHydrogen();
        cnt_h++;
        cv.notify_all();
    }

    void oxygen(function<void()> releaseOxygen) {
        unique_lock<mutex> lock(mtx);
        cv.wait(lock,[this]{return this->cnt_h==2;});
        // releaseOxygen() outputs "O". Do not change or remove this line.
        releaseOxygen();
        cnt_h=0;
        cv.notify_all();
    }
};

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-01-29 09:30:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-29 09:30:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-29 09:30:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-29 09:30:02       18 阅读

热门阅读

  1. G1与ZGC

    G1与ZGC

    2024-01-29 09:30:02      41 阅读
  2. 第二百九十三回

    2024-01-29 09:30:02       41 阅读
  3. 【leetcode100-074/075/076】【堆】三题合集

    2024-01-29 09:30:02       34 阅读
  4. 【力扣经典面试题】合并两个有序数组

    2024-01-29 09:30:02       36 阅读
  5. 算法提升——LeetCode382 场周赛总结

    2024-01-29 09:30:02       34 阅读
  6. go语言基础strconv类型转换

    2024-01-29 09:30:02       41 阅读
  7. 【身份验证和授权比较】

    2024-01-29 09:30:02       34 阅读
  8. shell 函数与数组

    2024-01-29 09:30:02       32 阅读
  9. PiflowX组件-FileRead

    2024-01-29 09:30:02       33 阅读