我们提供了一个类:

public class Foo {public void first() { print("first"); }public void second() { print("second"); }public void third() { print("third"); }
}

三个不同的线程 A、B、C 将会共用一个 Foo 实例。
一个将会调用 first() 方法
一个将会调用 second() 方法
还有一个将会调用 third() 方法
请设计修改程序,以确保 second() 方法在 first() 方法之后被执行,third() 方法在 second() 方法之后被执行。

示例 1:输入: [1,2,3]
输出: "firstsecondthird"
解释:
有三个线程会被异步启动。
输入 [1,2,3] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 second() 方法,线程 C 将会调用 third() 方法。
正确的输出是 "firstsecondthird"。
示例 2:输入: [1,3,2]
输出: "firstsecondthird"
解释:
输入 [1,3,2] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 third() 方法,线程 C 将会调用 second() 方法。
正确的输出是 "firstsecondthird"

代码

#include <semaphore.h>class Foo {protected:sem_t firstJobDone;sem_t secondJobDone;public:Foo() {sem_init(&firstJobDone, 0, 0);sem_init(&secondJobDone, 0, 0);}void first(function<void()> printFirst) {// printFirst() outputs "first".printFirst();sem_post(&firstJobDone);}void second(function<void()> printSecond) {sem_wait(&firstJobDone);// printSecond() outputs "second".printSecond();sem_post(&secondJobDone);}void third(function<void()> printThird) {sem_wait(&secondJobDone);// printThird() outputs "third".printThird();}
};

解析函数:

sem_t 数据类型

1、**int sem_init(sem_t *__sem, int __pshared, unsigned int __value)**

__pshared:shared参数控制着信号量的类型:
如果 pshared的值是0,就表示它是当前线程的局部信号量
如果pshared的值不为0,其它线程就能够共享这个信号量。
(Linux线程一般不支持线程间共享信号量,pshared传递一个非零将会使函数返回ENOSYS错误。)
__value:代表初始化的__sem值。

 int sem_post(sem_t  *__sem)

__sem的值+1

sem_wait(sem_t* sem)

用来等待信号量的值大于0(value > 0),等待时该线程为阻塞状态
解除阻塞后sem值会减去1

sem_trywait(sem_t *sem)

sem_wait()的非阻塞版本,直接将sem的值减去1

sem_destroy(sem_t* sem)

释放信号量sem

sem_getvalue(sem_t* sem, int* valp)

获取信号量sem的值并且保存在valp中

leetcode1114. 按序打印 靡不有初,鲜克有终,小白加油加油加油相关推荐

  1. (多线程)leetcode1114. 按序打印 认识AtomicInteger

    我们提供了一个类: public class Foo {   public void one() { print("one"); }   public void two() { p ...

  2. 如何快速学习产品?实践才是王道!同为小白的人儿加油!

    没有教育之谈,没有经验讲座,只有切身体会,去学,去做经常会有人来问,网上经常说的产品是什么?真正的产品定义又是什么?又该如何成为产品经理,走向产品之路?以上,这些问题,相信很多人已经都在各大PM网站, ...

  3. LeetCode 多线程 1114. 按序打印

    1114. 按序打印 Ideas 并发执行问题是多线程要解决的经典问题,此题是典型的执行屏障问题,因此我们需要构造几把锁来确保执行顺序. 题目要求按顺序依次执行三个方法,为了保证线程的执行顺序,可以在 ...

  4. 1114. 按序打印

    1114. 按序打印 我们提供了一个类: public class Foo { public void first() { print("first"); } public voi ...

  5. JAVA高考加油,高考加油的话 励志语录

    简介高考加油的话 励志语录,高考加油的话,寄语:如果说高考是一场战斗,那么你就是指挥战斗的将军,来吧,拿起你 高考加油的话 励志语录 分类: 高考加油的话 励志语录 寄语:如果说高考是一场战斗,那么你 ...

  6. JAVA高考加油,高考加油句子

    [高考加油句子] 1.学习可以知道自己的不足."学然后知不足".学习如登山.登小山,飘飘然,登大山,茫茫然,登深山,惶惶然,知然也."知然也"就是才知道&quo ...

  7. JAVA高考加油,高考加油的话

    高考加油的话 1.你还好吧,你远方的老同学真心的祝福你在今年的高考之中金榜提名,一举夺魁,考入心中理想的大学,进而步入人生的象牙塔! 2.流血流汗不流泪,争时争分更争位. 3.在签售会的时候,全场所有 ...

  8. 打印机打印,扫描小白教程(无需另装驱动)

    step1:查看打印机是否连接 打开控制面板: 查看电脑是否识别打印机 如果电脑打印机处有显示本台打印机,则识别成功,如果在未知的地方,则表示电脑还在识别,稍微等待下 step2:打印和扫描 点击打印 ...

  9. LeetCode 1114 按序打印

    https://leetcode-cn.com/problems/print-in-order/ 解决方案 class Foo {private AtomicInteger jobDone = new ...

  10. LeetCode 1114. 按序打印

    我们提供了一个类: public class Foo {public void first() { print("first"); }public void second() { ...

最新文章

  1. JGG:青岛大学苏晓泉团队利用条件致病菌指数评估环境微生物风险
  2. Seven Microservices Anti-patterns
  3. 知道了05后的隐藏技能之后,我酸了…​
  4. JZOJ 4673. 4504. 5635. 【NOI2018模拟4.7】LCS
  5. Java性能压测-性能监控-jvisualvm使用
  6. c++中CreateEvent函数解析(1)
  7. 短信认证方案,用手机短信进行上网认证如何实现?
  8. python最重要的库
  9. eclipse,myeclipse,Tomcat进行JSP开发配置
  10. 蓝桥杯 平方怪圈 JAVA
  11. 2022年下半年软件设计师下午真题及答案解析
  12. 青年志愿者演讲稿合集15篇
  13. uint在c语言中的作用,C中int,Uint,uint16等有什么区别以及用处
  14. [设计模式]创建模式-建造者(C++描述)
  15. 苹果手机投影到墙上_能塞进口袋里高颜值投影——创维小湃智能投影P1 Pro测评...
  16. vuejs中使用vuex的两种方案之一
  17. mysql:列类型之float、double
  18. ATS667LSG:真零速、高精度齿传感器 IC
  19. 电脑蓝屏0x000024解决记录
  20. 模拟电子技术(六)信号的运算与处理

热门文章

  1. 深度学习相关的硬件配置
  2. linux系统进入图文界面,Linux启动界面切换:图形界面-字符界面
  3. java pointer_Java EE 8 JSON Pointer讲解
  4. QML类型:Window
  5. Java2实用教程(第五版)/第五章例题
  6. wp友情链接php代码,wordpress友情链接函数详解
  7. php第三方支付宝支付,第三方对接-支付宝支付接入教程
  8. 【下载工具】哔哩哔哩视频下载器——(Downkyi)下载姬v1.3.3
  9. Processing创意编程(入门篇)
  10. 【数据挖掘】从“文本”到“知识”:信息抽取(Information Extraction)