C++ 1117 H2O生成

一、题目描述

现在有两种线程,氢 oxygen 和氧 hydrogen,你的目标是组织这两种线程来产生水分子。

存在一个屏障(barrier)使得每个线程必须等候直到一个完整水分子能够被产生出来。

氢和氧线程会被分别给予 releaseHydrogen 和 releaseOxygen 方法来允许它们突破屏障。

这些线程应该三三成组突破屏障并能立即组合产生一个水分子。

你必须保证产生一个水分子所需线程的结合必须发生在下一个水分子产生之前。

换句话说:

如果一个氧线程到达屏障时没有氢线程到达,它必须等候直到两个氢线程到达。
如果一个氢线程到达屏障时没有其它线程到达,它必须等候直到一个氧线程和另一个氢线程到达。
书写满足这些限制条件的氢、氧线程同步代码。

示例 1:
输入: "HOH"
输出: "HHO"
解释: "HOH" 和 "OHH" 依然都是有效解。

示例 2:
输入: "OOHHHH"
输出: "HHOHHO"
解释: "HOHHHO", "OHHHHO", "HHOHOH", "HOHHOH", "OHHHOH", "HHOOHH", "HOHOHH" 和 "OHHOHH" 依然都是有效解。

二、程序实例

  1. 方法一:使用mutex互斥锁
class H2O {
private:
    int countOxygen;
    pthread_mutex_t lockHy;
    pthread_mutex_t lockOx;
public:
    H2O() {
        pthread_mutex_init(&lockHy, NULL);
        pthread_mutex_init(&lockOx, NULL);
        pthread_mutex_lock(&lockOx);
        this->countOxygen = 2;
    }

    void hydrogen(function<void()> releaseHydrogen) {
        pthread_mutex_lock(&lockHy);
        // releaseHydrogen() outputs "H". Do not change or remove this line.
        releaseHydrogen();
        this->countOxygen--;
        if(this->countOxygen > 0){
            pthread_mutex_unlock(&lockHy);
        }else{
            pthread_mutex_unlock(&lockOx);
        }
    }

    void oxygen(function<void()> releaseOxygen) {
        pthread_mutex_lock(&lockOx);
        // releaseOxygen() outputs "O". Do not change or remove this line.
        releaseOxygen();
        this->countOxygen = 2;
        pthread_mutex_unlock(&lockHy);
    }
};
  1. 方法二:使用sem信号量
    执行用时 :16 ms, 在所有 C++ 提交中击败了72.87%的用户
    内存消耗 :11.4 MB, 在所有 C++ 提交中击败了100.00%的用户
#include<semaphore.h>
class H2O {
private:
    sem_t h;
    sem_t o;
    int counter;
public:
    H2O() {
        sem_init(&h, 0, 2);
        sem_init(&o, 0, 0);
        counter = 0;
    }

    void hydrogen(function<void()> releaseHydrogen) {
        sem_wait(&h);
        // releaseHydrogen() outputs "H". Do not change or remove this line.
        releaseHydrogen();
        counter++;
        if(counter == 2){
            sem_post(&o);
        }
    }

    void oxygen(function<void()> releaseOxygen) {
        sem_wait(&o);
        // releaseOxygen() outputs "O". Do not change or remove this line.
        releaseOxygen();
        counter = 0;
        sem_post(&h);
        sem_post(&h);
    }
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目描述 现在有两种线程,氢 oxygen 和氧 hydrogen,你的目标是组织这两种线程来产生水分子。 存在一...
    Renaissance_阅读 668评论 1 0
  • 基础化学笔记(无机化学) 第一章 化学基础概念 问题:“理想气体”的含义?实际气体和理想气体的差别?如何分离铀23...
    enpassant阅读 11,462评论 0 20
  • 平静其实很难得,人心皆是躁动的。人生如果不曾惊涛骇浪,总是心有不甘。要到一定年纪,才能从平静中感受世界的喧嚣,不被...
    林凡的天空阅读 344评论 0 1
  • 昨天和老公聊到他一个朋友的生活。 老公在感慨,他的一位同学在很年轻大概二十多岁就入职一家保险公司,做到...
    山中雏菊阅读 400评论 3 4
  • 如今大多是新媒体运营,新媒体运营讲究的不是单纯的内容整合,而是要在内容传播的过程中,为产品的价值或品牌传播树立基准...
    家装工程易先生阅读 477评论 0 0