题目来源:https://leetcode-cn.com/problems/print-in-order/

我们提供了一个类:

public class Foo {
  public void one() { print("one"); }
  public void two() { print("two"); }
  public void three() { print("three"); }
}
三个不同的线程将会共用一个 Foo 实例。

线程 A 将会调用 one() 方法
线程 B 将会调用 two() 方法
线程 C 将会调用 three() 方法
请设计修改程序,以确保 two() 方法在 one() 方法之后被执行,three() 方法在 two() 方法之后被执行。

示例 1:

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

输入: [1,3,2]
输出: "onetwothree"
解释:
输入 [1,3,2] 表示线程 A 将会调用 one() 方法,线程 B 将会调用 three() 方法,线程 C 将会调用 two() 方法。
正确的输出是 "onetwothree"。

注意:

尽管输入中的数字似乎暗示了顺序,但是我们并不保证线程在操作系统中的调度顺序。

你看到的输入格式主要是为了确保测试的全面性。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/print-in-order
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

  设置两道阻塞,使三个线程按顺序执行,前一个线程执行完释放一个,后一个线程继续执行

 typedef struct {
// User defined data may be declared here.
//设置互斥量
pthread_mutex_t mtx1;
pthread_mutex_t mtx2;
} Foo; Foo* fooCreate() {
Foo* obj = (Foo*) malloc(sizeof(Foo)); // Initialize user defined data here.
//初始化
pthread_mutex_init(&obj->mtx1,NULL);
pthread_mutex_init(&obj->mtx2,NULL);
//锁定,防止2和3提前执行
pthread_mutex_lock(&obj->mtx1);
pthread_mutex_lock(&obj->mtx2);
return obj;
} void first(Foo* obj) { // printFirst() outputs "first". Do not change or remove this line.
printFirst();
//释放锁,让2线程执行
pthread_mutex_unlock(&obj->mtx2);
} void second(Foo* obj) { // printSecond() outputs "second". Do not change or remove this line.
//阻塞,等待1线程释放锁
pthread_mutex_lock(&obj->mtx2);
printSecond();
pthread_mutex_unlock(&obj->mtx2);
//释放锁,让3线程执行
pthread_mutex_unlock(&obj->mtx1);
} void third(Foo* obj) { // printThird() outputs "third". Do not change or remove this line.
//阻塞,等待2线程释放
pthread_mutex_lock(&obj->mtx1);
printThird();
pthread_mutex_unlock(&obj->mtx1);
} void fooFree(Foo* obj) {
// User defined data may be cleaned up here.
pthread_mutex_destroy(&obj->mtx1);
pthread_mutex_destroy(&obj->mtx2);
//释放obj!!
free(obj);
}

(LeetCode)1114. 按序打印的更多相关文章

  1. [LeetCode]1114. 按序打印(并发)

    ####题目 我们提供了一个类: public class Foo {   public void one() { print("one"); }   public void tw ...

  2. LeetCode:按序打印【1114】

    LeetCode:按序打印[1114] 题目描述 我们提供了一个类: 1 2 3 4 5 public class Foo {   public void one() { print("on ...

  3. LeetCode:交替打印【1115】

    LeetCode:交替打印[1115] 题目描述 我们提供一个类: class FooBar { public void foo() { for (int i = 0; i < n; i++) ...

  4. ERP按序打印问题

    按序打印只适合一个机器,不适合主副机模式,主副机模式请勾选同时打印 如果开启主副机模式勾选了按序打印,会造成副机下厨后厨不出单

  5. Java多线程wait和notify协作,按序打印abc

    有一个经典的多线程面试题:启三个线程,按序打印ABC 上代码: package cn.javaBase.study_thread1; class MyRunnable1 implements Runn ...

  6. LeetCode 按序打印

    第1114题 我们提供了一个类: public class Foo {   public void one() { print("one"); }   public void tw ...

  7. 【Leetcode】交替打印FooBar

    [问题]我们提供一个类: class FooBar { public void foo() { ; i < n; i++) { print("foo"); } } publi ...

  8. LeetCode 题解目录

    前言 本目录将不断更新记录leetcode的刷题日记. 二叉树 序号 标题 难度 标签 1 108 将有序数组转换为二叉搜索树 简单 树.深度优先搜索 2 538 把二叉搜索树转换为累加树 简单 树 ...

  9. Java并发相关知识点梳理和研究

    1. 知识点思维导图 (图比较大,可以右键在新窗口打开) 2. 经典的wait()/notify()/notifyAll()实现生产者/消费者编程范式深入分析 & synchronized 注 ...

随机推荐

  1. 计算机和python

    计算机基础知识 CPU 人类的大脑 运算和处理问题 内存 临时存储数据 断电就消失了 硬盘 永久 存储数据 操作系统是一个(特殊)的程序,调度硬件和软件之间的数据交互 python的应用和历史 IT, ...

  2. TCP socket 编程

    TCP socket 编程 讲一下 socket 编程 步骤 使用 socket 模块 建立 TCP socket 客户端和服务端 客户端和服务端之间的通信 图解 编程 举个例子 tcp_server ...

  3. 给Tomcat打开远程debug端口

    >cd apache-tomcat-8.5.24 >cd conf >vim catalina.sh 在文件开始处添加: CATALINA_OPTS="-server -X ...

  4. 通用mapper将另外一个同名的表生成在同一个实体及mapper中

    今天遇见了一个在网上都搜索不到的错误,使用通过mapper生成实体及mapper文件时会将另外一个数据库的同名文件生成在一个实体及mapper中,这样就会造成一个实体和mapper中有两个表的字段,经 ...

  5. scrapy常用设置和注意点!!!!

    setting里的设置 HTTPERROR_ALLOWED_CODES = [405]   //这一条是忽略405错误退出进程,有可能跳到405页面,在parse注意判断,重新请求页面 爬虫里的设置 ...

  6. 第一篇.1、python基础之核心风格

    一.语句和语法 #:注释 \:转译回车,继续上一行,在一行语句较长的情况下可以使用其来切分成多行,因其可读性差所以不建议使用 ::将两个语句连接到一行,可读性差,不建议使用 ::将代码的头和体分开 语 ...

  7. aiomysql实现对数据库异步读取

    有一个库叫做aiomysql,这是一个基于asyncio和pymysql的库.至于为什么可以在tornado中使用,是因为高版本tornado的底层使用了asyncio. import asyncio ...

  8. 文件hash、上传,实现文件上传重复验证

    在平台开发中,我们往往对性能要求十分严苛,每一个字段.接口都有严格的要求. 系统中文件流操作十分占用资源,这里为大家介绍对文件上传进行哈希校验---同一文件只允许上传一次到服务器,其他的上传只要指向文 ...

  9. oracle修改某个表的字段顺序

    有时候会发现某个表的列顺序不理想,想修改 -1查询表, select * from AIRWAY_TYPE t --2 查询用户和表名,找到obj#,select object_id from all ...

  10. mysql自增字段AUTO_INCREMENT重排或归零

    由于删除了某些记录行,导致自增字段不连续了,重排或归零的方法: 方法1:truncate table 你的表名//这样不但重新定位自增的字段,而且会将表里的数据全部删除,慎用! 方法2:delete ...