leetcode 交替打印字符串 中等
时间:2021-09-20
本文章向大家介绍leetcode 交替打印字符串 中等,主要包括leetcode 交替打印字符串 中等使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
使用 4 个互斥锁进行线程同步,假设4个锁分别为 a,b,c,d,对应 fizz, buzz, fizzbuzz, number 四个函数.
由于是从 1 开始进行打印,所以初始化时将 a,b,c 这三个锁锁住,只留下 d 作为入口。
接下来有两种方式:
① 先打印当前的数,然后通过下一个数判断对哪个锁进行解锁。。。
② 程序按照固定的方式进行解锁,即 fizz 中解除 b,buzz 解除 c,fizzbuzz 解除 d,number 解除 a。
class FizzBuzz { private: int n; public: FizzBuzz(int n) { this->n = n; mutexFizz.lock(); mutexBuzz.lock(); mutexFB.lock(); } // printFizz() outputs "fizz". void fizz(function<void()> printFizz) { while(cur <= n) { mutexFizz.lock(); if(cur > n) { mutexFizz.unlock(); break; } // 因为到自己的时候, cur 已经可能越界了, 结束线程, 并自行进行解锁 printFizz(); next(); } } // printBuzz() outputs "buzz". void buzz(function<void()> printBuzz) { while(cur <= n) { mutexBuzz.lock(); if(cur > n) { mutexBuzz.unlock(); break; } printBuzz(); next(); } } // printFizzBuzz() outputs "fizzbuzz". void fizzbuzz(function<void()> printFizzBuzz) { while(cur <= n) { mutexFB.lock(); if(cur > n) { mutexFB.unlock(); break; } printFizzBuzz(); next(); } } // printNumber(x) outputs "x", where x is an integer. void number(function<void(int)> printNumber) { while(cur <= n) { mutexNum.lock(); if(cur > n) { mutexNum.unlock(); break; } printNumber(cur); next(); } } private: int cur = 1; mutex mutexFizz, mutexBuzz, mutexFB, mutexNum; void next() { ++ cur; if(cur > n) { // 打印任务结束, 唤醒所有线程进行结束 mutexFB.unlock(); mutexFizz.unlock(); mutexBuzz.unlock(); mutexNum.unlock(); return; } if(cur % 15 == 0) mutexFB.unlock(); else if(cur % 3 == 0) mutexFizz.unlock(); else if(cur % 5 == 0) mutexBuzz.unlock(); else mutexNum.unlock(); } };
class FizzBuzz { private: int n; mutex a, b, c, d; public: FizzBuzz(int n) { this->n = n; b.lock(); c.lock(); d.lock(); } // printFizz() outputs "fizz". void fizz(function<void()> printFizz) { for (int i = 1; i <= n; ++i) { a.lock(); if (i % 3 == 0&&i % 15!=0)printFizz(); b.unlock(); } } // printBuzz() outputs "buzz". void buzz(function<void()> printBuzz) { for (int i = 1; i <=n; ++i) { b.lock(); if (i % 5 == 0&&i%15!=0)printBuzz(); c.unlock(); } } // printFizzBuzz() outputs "fizzbuzz". void fizzbuzz(function<void()> printFizzBuzz) { for (int i = 1; i <= n; ++i) { c.lock(); if (i % 15==0)printFizzBuzz(); d.unlock(); } } // printNumber(x) outputs "x", where x is an integer. void number(function<void(int)> printNumber) { for (int i = 1; i <= n; ++i) { d.lock(); if (i % 3 != 0 && i % 5 != 0)printNumber(i); a.unlock(); } } };
原文地址:https://www.cnblogs.com/rookie-acmer/p/15314323.html
- ImageView的scaletype属性
- 云计算和虚拟机基础梳理
- Python-Socket
- 用Sysctl 调整Linux操作系统的性能
- python-基础案例
- css3 3d变换和动画——回顾
- eclipse中关联文件设置方法
- Kubernetes服务网格(第8部分):Linkerd作为入口控制器
- 使用RestSharp 库消费Restful Service
- Python-面向对像及其他
- 基于MongoDB GridFS的图片存储
- css3 过渡和2d变换——回顾
- Microsoft 防跨站点脚本库AntiXSS Library v4.2.1
- Compilify——让你在浏览器中编译.NET代码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Backtracking - 216. Combination Sum III
- Backtracking - 40. Combination Sum II
- Backtracking - 39. Combination Sum
- Backtracking - 77. Combinations
- Backtracking - 90. Subsets II
- Backtracking - 78. Subsets
- Tree - 331. Verify Preorder Serialization of a Binary Tree
- Tree - 95. Unique Binary Search Trees II
- Tree - 96. Unique Binary Search Trees
- Tree - 116. Populating Next Right Pointers in Each Node
- Tree - 297. Serialize and Deserialize Binary Tree
- 使用 shell 脚本批量创建用户详解讲解
- Tree - 230. Kth Smallest Element in a BST
- Tree - 173. Binary Search Tree Iterator
- Tree - 450. Delete Node in a BST