前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode 1195 - Fizz Buzz Multithreaded

LeetCode 1195 - Fizz Buzz Multithreaded

作者头像
Reck Zhang
发布2021-08-11 11:02:16
发布2021-08-11 11:02:16
38000
代码可运行
举报
文章被收录于专栏:Reck ZhangReck Zhang
运行总次数:0
代码可运行

Fizz Buzz Multithreaded

Desicription

Write a program that outputs the string representation of numbers from 1 to n, however:

  • If the number is divisible by 3, output “fizz”.
  • If the number is divisible by 5, output “buzz”.
  • If the number is divisible by both 3 and 5, output “fizzbuzz”.

For example, for n = 15, we output: 1, 2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, fizz, 13, 14, fizzbuzz.

Suppose you are given the following code:

代码语言:javascript
代码运行次数:0
运行
复制
class FizzBuzz {
  public FizzBuzz(int n) { ... }               // constructor
  public void fizz(printFizz) { ... }          // only output "fizz"
  public void buzz(printBuzz) { ... }          // only output "buzz"
  public void fizzbuzz(printFizzBuzz) { ... }  // only output "fizzbuzz"
  public void number(printNumber) { ... }      // only output the numbers
}

Implement a multithreaded version of FizzBuzz with four threads. The same instance of FizzBuzz will be passed to four different threads:

  1. Thread A will call fizz() to check for divisibility of 3 and outputs fizz.
  2. Thread B will call buzz() to check for divisibility of 5 and outputs buzz.
  3. Thread C will call fizzbuzz() to check for divisibility of 3 and 5 and outputs fizzbuzz.
  4. Thread D will call number() which should only output the numbers.

Solution

代码语言:javascript
代码运行次数:0
运行
复制
class FizzBuzz {
private:
    int n;
    int index = 1;
    std::mutex mutex_{};
    std::condition_variable condition_variable_{};
public:
    FizzBuzz(int n) {
        this->n = n;
    }

    // printFizz() outputs "fizz".
    void fizz(const std::function<void()>& printFizz) {
        while(index <= n) {
            std::unique_lock unique_lock_{mutex_};
            condition_variable_.wait(unique_lock_, [&](){
                return (index % 3 == 0 && index % 5 != 0) || index > n;
            });
            if(index > n) {
                condition_variable_.notify_all();
                return ;
            }
            printFizz();
            index += 1;
            condition_variable_.notify_all();
        }
    }

    // printBuzz() outputs "buzz".
    void buzz(const std::function<void()>& printBuzz) {
        while(index <= n) {
            std::unique_lock unique_lock_{mutex_};
            condition_variable_.wait(unique_lock_, [&](){
                return (index % 3 != 0 && index % 5 == 0) || index > n;
            });
            if(index > n) {
                condition_variable_.notify_all();
                return ;
            }
            printBuzz();
            index += 1;
            condition_variable_.notify_all();
        }
    }

    // printFizzBuzz() outputs "fizzbuzz".
    void fizzbuzz(const std::function<void()>& printFizzBuzz) {
        while(index <= n) {
            std::unique_lock unique_lock_{mutex_};
            condition_variable_.wait(unique_lock_, [&](){
                return (index % 3 == 0 && index % 5 == 0) || index > n;
            });
            if(index > n) {
                condition_variable_.notify_all();
                return ;
            }
            printFizzBuzz();
            index += 1;
            condition_variable_.notify_all();
        }
    }

    // printNumber(x) outputs "x", where x is an integer.
    void number(const std::function<void(int)>& printNumber) {
        while(index <= n) {
            std::unique_lock unique_lock_{mutex_};
            condition_variable_.wait(unique_lock_, [&](){
                return index % 3 != 0 && index % 5 != 0;
            });
            if(index > n) {
                condition_variable_.notify_all();
                return ;
            }
            printNumber(index);
            index += 1;
            condition_variable_.notify_all();
        }
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Fizz Buzz Multithreaded
    • Desicription
    • Solution
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档