前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >信号(三)- 示例演示

信号(三)- 示例演示

作者头像
用户7741497
发布于 2022-08-03 02:10:40
发布于 2022-08-03 02:10:40
72200
代码可运行
举报
文章被收录于专栏:hml_知识记录hml_知识记录
运行总次数:0
代码可运行

运行示例

MainProducerConsumer 这三个类中的每一个都有自己的 Run 方法,最好在各自的终端窗口中运行它们。每次运行时,它都会显示它为日志生成的消息。一旦用户通过提供它正在等待的输入来响应 Main 类,MainRun 方法将终止删除信号量。然后,用户可以通过键入命令查看所有进程的合并日志文件的显示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  Do ##class(Semaphore.Util).ShowLog()

注意:以下所有示例都假定所有类都已在“USER”命名空间中编译。

示例 1 - 创建和删除信号量

最简单的例子演示了信号量的创建和销毁。它使用 Semaphore.Main 类。请执行下列操作:

  1. 打开一个终端窗口。
  2. 输入命令——
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Do ##class(Semaphore.Main).Run()
  1. 该方法创建信号量。如果成功,将看到消息“输入任何字符以终止运行方法”。按下 Enter 键。该方法显示信号量的初始化值,将其删除,然后退出。
  2. 通过发出命令显示日志文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Do ##class(Semaphore.Util).ShowLog()

按照上述步骤在终端窗口中显示的消息示例如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
消息示例如下

DHC-APP>Do ##class(Semaphore.Main).Run()
(1) Main Started
(2) New semaphore
(3) Created: "Counter"; Value = 0; Id = 0x0x10000
(4) Semaphore create result: 1
(5) Enter any character to terminate Run method
(6) Final value = 0
(7) Semaphore delete status: 1
(8) Main Finished
(9) Closing Semaphore: Id = 0x10000

日志输出如下所示:
DHC-APP>  Do ##class(Semaphore.Util).ShowLog()
Message Log: Entries = 9
 
#    $JOB   Sender       Message
1)   24888  Main:        Main Started
2)   24888  Counter:     New semaphore
3)   24888  Counter:     Created: "Counter"; Value = 0; Id = 0x0x10000
4)   24888  Main:        Semaphore create result: 1
5)   24888  Main:        Enter any character to terminate Run method
6)   24888  Main:        Final value = 0
7)   24888  Main:        Semaphore delete status: 1
8)   24888  Main:        Main Finished
9)   24888  Counter:     Closing Semaphore: Id = 0x10000

示例 2——创建信号量并连续递增它

这个例子展示了生产者在工作,以及从两个进程中捕获日志消息。

  1. 打开两个单独的终端窗口。称它们为“A”“B”
  2. 在窗口 A 中,键入以下命令,但不要在末尾键入 ENTER 键 -
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Do ##class(Semaphore.Main).Run()
  1. 在窗口 B 中,键入以下命令,但同样,不要在命令末尾键入 ENTER 键 -
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Do ##class(Semaphore.Producer).Run()
  1. 现在,在窗口 A 中,按 ENTER 键。然后在窗口 B 中,按 ENTER 键。这将启动两个类并行执行。他们各自的消息显示在他们自己的窗口中。
  2. Producer 进程完成后,关闭 B 窗口。
  3. A 窗口中,按 ENTER 键以完成 Main 类。然后,使用以下命令显示日志 -
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Do ##class(Semaphore.Util).ShowLog()

对于此示例,以下是输出

A 窗口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DHC-APP>Do ##class(Semaphore.Main).Run()
(1) Main Started
(2) New semaphore
(3) Created: "Counter"; Value = 0; Id = 0x0x20001
(4) Semaphore create result: 1
(5) Enter any character to terminate Run method
(17) Final value = 30
(18) Semaphore delete status: 1
(19) Main Finished
(20) Closing Semaphore: Id = 0x20001

B 窗口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DHC-APP>Do ##class(Semaphore.Producer).Run()
(6) Producer.1 Started
(7) New semaphore
(8) Open Id = 0x20001
(9) Increment 0x20001 = 0 by 5 wait 10 sec
(10) Increment 0x20001 = 5 by 5 wait 4 sec
(11) Increment 0x20001 = 10 by 3 wait 1 sec
(12) Increment 0x20001 = 13 by 5 wait 9 sec
(13) Increment 0x20001 = 18 by 5 wait 8 sec
(14) Increment 0x20001 = 23 by 4 wait 2 sec
(15) Increment 0x20001 = 27 by 1 wait 8 sec
(16) Increment 0x20001 = 28 by 2 wait 5 sec
(21) Producer.1 Finished
(22) Closing Semaphore: Id = 0x20001

日志显示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DHC-APP>Do ##class(Semaphore.Util).ShowLog()
Message Log: Entries = 22
 
#    $JOB   Sender       Message
1)   21080  Main:        Main Started
2)   21080  Counter:     New semaphore
3)   21080  Counter:     Created: "Counter"; Value = 0; Id = 0x0x20001
4)   21080  Main:        Semaphore create result: 1
5)   21080  Main:        Enter any character to terminate Run method
6)   27724  Producer.1:  Producer.1 Started
7)   27724  Counter:     New semaphore
8)   27724  Producer.1:  Open Id = 0x20001
9)   27724  Producer.1:  Increment 0x20001 = 0 by 5 wait 10 sec
10)  27724  Producer.1:  Increment 0x20001 = 5 by 5 wait 4 sec
11)  27724  Producer.1:  Increment 0x20001 = 10 by 3 wait 1 sec
12)  27724  Producer.1:  Increment 0x20001 = 13 by 5 wait 9 sec
13)  27724  Producer.1:  Increment 0x20001 = 18 by 5 wait 8 sec
14)  27724  Producer.1:  Increment 0x20001 = 23 by 4 wait 2 sec
15)  27724  Producer.1:  Increment 0x20001 = 27 by 1 wait 8 sec
16)  27724  Producer.1:  Increment 0x20001 = 28 by 2 wait 5 sec
17)  21080  Main:        Final value = 30
18)  21080  Main:        Semaphore delete status: 1
19)  21080  Main:        Main Finished
20)  21080  Counter:     Closing Semaphore: Id = 0x20001
21)  27724  Producer.1:  Producer.1 Finished
22)  27724  Counter:     Closing Semaphore: Id = 0x20001

示例 3 - 同时运行所有三个进程

此示例显示尝试以连贯的方式增加和减少相同的信号量。它使用所有三个主要类。

  1. 打开三个单独的终端窗口。称它们为“A”“B”“C”
  2. 在窗口 A 中,键入以下命令,但最后不要按 ENTER
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Do ##class(Semaphore.Main).Run()
  1. 在窗口 B 中,键入以下命令,但同样,不要在命令末尾按 ENTER 键 -
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Do ##class(Semaphore.Producer).Run()
  1. 在窗口 C 中,键入以下命令,但同样,不要在命令末尾按 ENTER 键 -
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Do ##class(Semaphore.Consumer).Run()
  1. 从窗口 A 开始,访问每个窗口并键入 ENTER 键。这将启动 Main 类,然后是其他两个类。如前所述,每个进程都会在自己的窗口中显示其日志消息。
  2. ProducerConsumer 进程都完成后,关闭B 窗口和C 窗口。
  3. A 窗口中,按 ENTER 键以完成 Main 类。然后,使用以下命令显示日志
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Do ##class(Semaphore.Util).ShowLog()

运行此示例会产生类似于以下内容的输出:

窗口 A

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DHC-APP>Do ##class(Semaphore.Main).Run()
(1) Main Started
(2) New semaphore
(3) Created: "Counter"; Value = 0; Id = 0x0x40003
(4) Semaphore create result: 1
(5) Enter any character to terminate Run method
<ENTER>
(64) Final value = 0
(65) Semaphore delete status: 1
(66) Main Finished
(67) Closing Semaphore: Id = 0x40003

窗口B

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DHC-APP>Do ##class(Semaphore.Producer).Run()
(6) Producer.1 Started
(7) New semaphore
(8) Open Id = 0x40003
(9) Increment 0x40003 = 0 by 5 wait 8 sec
(20) Increment 0x40003 = 0 by 4 wait 4 sec
(25) Increment 0x40003 = 0 by 3 wait 1 sec
(29) Increment 0x40003 = 0 by 2 wait 10 sec
(36) Increment 0x40003 = 0 by 4 wait 3 sec
(40) Increment 0x40003 = 0 by 5 wait 5 sec
(52) Increment 0x40003 = 0 by 5 wait 6 sec
(58) Increment 0x40003 = 0 by 2 wait 2 sec
(62) Producer.1 Finished
(63) Closing Semaphore: Id = 0x40003

窗口C

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DHC-APP>Do ##class(Semaphore.Consumer).Run()
(10) Consumer.1 Started
(11) New semaphore
(12) Consumer: Open Id = 0x40003
(13) Decrement 0x40003 = 5 by 1 wait 10 sec
(14) WaitCompleted: 0x40003; Amt = 1
(15) Granted
(16) Decrement 0x40003 = 4 by 5 wait 2 sec
(17) WaitCompleted: 0x40003; Amt = 4
(18) Granted
(19) Decrement 0x40003 = 0 by 5 wait 8 sec
(21) WaitCompleted: 0x40003; Amt = 4
(22) Granted
(23) Decrement 0x40003 = 0 by 5 wait 6 sec
(25) WaitCompleted: 0x40003; Amt = 3
(26) Granted
(27) Decrement 0x40003 = 0 by 3 wait 1 sec
(28) Timeout
(30) Decrement 0x40003 = 0 by 4 wait 4 sec
(31) WaitCompleted: 0x40003; Amt = 2
(32) Granted
(33) Decrement 0x40003 = 0 by 2 wait 7 sec
(34) Timeout
(35) Decrement 0x40003 = 0 by 4 wait 9 sec
(37) WaitCompleted: 0x40003; Amt = 4
(38) Granted
(39) Decrement 0x40003 = 0 by 2 wait 5 sec
(41) WaitCompleted: 0x40003; Amt = 2
(42) Granted
(43) Decrement 0x40003 = 3 by 1 wait 3 sec
(44) WaitCompleted: 0x40003; Amt = 1
(45) Granted
(46) Decrement 0x40003 = 2 by 2 wait 10 sec
(47) WaitCompleted: 0x40003; Amt = 2
(48) Granted
(49) Decrement 0x40003 = 0 by 2 wait 4 sec
(50) Timeout
(51) Decrement 0x40003 = 0 by 3 wait 4 sec
(53) WaitCompleted: 0x40003; Amt = 5
(54) Granted
(55) Decrement 0x40003 = 0 by 1 wait 1 sec
(56) Timeout
(57) Decrement 0x40003 = 0 by 3 wait 7 sec
(59) WaitCompleted: 0x40003; Amt = 2
(60) Granted
(61) Consumer.1 Finished

日志显示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DHC-APP>Do ##class(Semaphore.Util).ShowLog()
Message Log: Entries = 67
 
#    $JOB   Sender       Message
1)   6412   Main:        Main Started
2)   6412   Counter:     New semaphore
3)   6412   Counter:     Created: "Counter"; Value = 0; Id = 0x0x40003
4)   6412   Main:        Semaphore create result: 1
5)   6412   Main:        Enter any character to terminate Run method
6)   22236  Producer.1:  Producer.1 Started
7)   22236  Counter:     New semaphore
8)   22236  Producer.1:  Open Id = 0x40003
9)   22236  Producer.1:  Increment 0x40003 = 0 by 5 wait 8 sec
10)  20224  Consumer.1:  Consumer.1 Started
11)  20224  Counter:     New semaphore
12)  20224  Consumer.1:  Consumer: Open Id = 0x40003
13)  20224  Consumer.1:  Decrement 0x40003 = 5 by 1 wait 10 sec
14)  20224  Counter:     WaitCompleted: 0x40003; Amt = 1
15)  20224  Consumer.1:  Granted
16)  20224  Consumer.1:  Decrement 0x40003 = 4 by 5 wait 2 sec
17)  20224  Counter:     WaitCompleted: 0x40003; Amt = 4
18)  20224  Consumer.1:  Granted
19)  20224  Consumer.1:  Decrement 0x40003 = 0 by 5 wait 8 sec
20)  22236  Producer.1:  Increment 0x40003 = 0 by 4 wait 4 sec
21)  20224  Counter:     WaitCompleted: 0x40003; Amt = 4
22)  20224  Consumer.1:  Granted
23)  20224  Consumer.1:  Decrement 0x40003 = 0 by 5 wait 6 sec
24)  22236  Producer.1:  Increment 0x40003 = 0 by 3 wait 1 sec
25)  20224  Counter:     WaitCompleted: 0x40003; Amt = 3
26)  20224  Consumer.1:  Granted
27)  20224  Consumer.1:  Decrement 0x40003 = 0 by 3 wait 1 sec
28)  20224  Consumer.1:  Timeout
29)  22236  Producer.1:  Increment 0x40003 = 0 by 2 wait 10 sec
30)  20224  Consumer.1:  Decrement 0x40003 = 0 by 4 wait 4 sec
31)  20224  Counter:     WaitCompleted: 0x40003; Amt = 2
32)  20224  Consumer.1:  Granted
33)  20224  Consumer.1:  Decrement 0x40003 = 0 by 2 wait 7 sec
34)  20224  Consumer.1:  Timeout
35)  20224  Consumer.1:  Decrement 0x40003 = 0 by 4 wait 9 sec
36)  22236  Producer.1:  Increment 0x40003 = 0 by 4 wait 3 sec
37)  20224  Counter:     WaitCompleted: 0x40003; Amt = 4
38)  20224  Consumer.1:  Granted
39)  20224  Consumer.1:  Decrement 0x40003 = 0 by 2 wait 5 sec
40)  22236  Producer.1:  Increment 0x40003 = 0 by 5 wait 5 sec
41)  20224  Counter:     WaitCompleted: 0x40003; Amt = 2
42)  20224  Consumer.1:  Granted
43)  20224  Consumer.1:  Decrement 0x40003 = 3 by 1 wait 3 sec
44)  20224  Counter:     WaitCompleted: 0x40003; Amt = 1
45)  20224  Consumer.1:  Granted
46)  20224  Consumer.1:  Decrement 0x40003 = 2 by 2 wait 10 sec
47)  20224  Counter:     WaitCompleted: 0x40003; Amt = 2
48)  20224  Consumer.1:  Granted
49)  20224  Consumer.1:  Decrement 0x40003 = 0 by 2 wait 4 sec
50)  20224  Consumer.1:  Timeout
51)  20224  Consumer.1:  Decrement 0x40003 = 0 by 3 wait 4 sec
52)  22236  Producer.1:  Increment 0x40003 = 0 by 5 wait 6 sec
53)  20224  Counter:     WaitCompleted: 0x40003; Amt = 5
54)  20224  Consumer.1:  Granted
55)  20224  Consumer.1:  Decrement 0x40003 = 0 by 1 wait 1 sec
56)  20224  Consumer.1:  Timeout
57)  20224  Consumer.1:  Decrement 0x40003 = 0 by 3 wait 7 sec
58)  22236  Producer.1:  Increment 0x40003 = 0 by 2 wait 2 sec
59)  20224  Counter:     WaitCompleted: 0x40003; Amt = 2
60)  20224  Consumer.1:  Granted
61)  20224  Consumer.1:  Consumer.1 Finished
62)  22236  Producer.1:  Producer.1 Finished
63)  22236  Counter:     Closing Semaphore: Id = 0x40003
64)  6412   Main:        Final value = 0
65)  6412   Main:        Semaphore delete status: 1
66)  6412   Main:        Main Finished
67)  6412   Counter:     Closing Semaphore: Id = 0x40003

其他变量

此示例的其他变量是可能的。虽然一次只能运行一个 Semaphore.Main,但在其他窗口中执行的生产者或消费者的数量没有限制。鼓励用户在各种场景中尝试不同数量的消费者和生产者,例如

  • 运行三个消费者和一个生产者,这样信号量就会有更大的“竞争”。运气好的话,日志会显示两个或多个消费者发出了减少信号量的请求,并且都成功了,因为信号量值大到足以满足两个请求的部分或全部。
  • 还可以使用这些类来演示删除信号量时其他进程中发生的情况。为此,在 ProducersConsumers 运行时,切换到 Main 类正在运行的窗口,然后按 ENTER。在完成处理过程中,Main 类将删除信号量,ProducerConsumerOREF 将不再有效。下次尝试使用将产生错误。
  • 通过将信号量的名称更改为看起来像全局名称的名称,可以将信号量映射到例如 ECP 系统上的不同实例。

本文系转载,前往查看

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

本文系转载,前往查看

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
信号(二)- 生产者消费者示例
下面是一系列使用信号量实现生产者/消费者场景的类。 “主”进程初始化信号量并等待用户指示活动已全部完成。生产者在循环中随机增加一个信号量值,更新之间的延迟可变。消费者尝试在随机时间从信号量中删除随机数量,也是在循环中。该示例由 5 个类组成:
用户7741497
2022/08/03
3300
信号(四)- 多进程任务示例
可根据此思想进行多任务启动查询汇总数据。 原理利用job机制开启后台进程。利用loop循环减少进程的数量等于开启进程的数量,判断多进程任务是否完成。创建表并插入1000W条数据,统计Moeny字段总金额创建demo代码如下。Class Demo.SemaphoreDemo Extends %RegisteredObject{/// Do ##class(Demo.SemaphoreDemo).Sample(5)ClassMethod Sample(pJobCount = 3){ k ^yx("Amt
用户7741497
2022/08/03
2290
【线程同步】信号量
信号量相当于进化版的互斥锁。由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降,线程从并行执行变成了串行执行,与直接使用单进程无异。信号量是相对折衷的一种处理方式,既能保证同步,数据不混乱,又能提高线程并发。
mindtechnist
2024/08/08
1760
【线程同步】信号量
python 并行编程 多线程 锁 信号 条件 事件
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}) import threading
用户5760343
2022/05/13
3750
python 并行编程 多线程 锁 信号 条件 事件
Java并发编程的总结和思考
编写优质的并发代码是一件难度极高的事情。Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的实践后,实现并发编程就有了更多的方案和更好的选择。本文是对并发编程的一点总结和思考,同时也分享了Java 5以后的版本中如何编写并发代码的一点点经验。
大龄老码农-昊然
2021/04/03
3110
Java并发编程的总结和思考
GCD信号量-dispatch_semaphore_t
1.GCD信号量简介 GCD信号量机制主要涉及到以下三个函数: dispatch_semaphore_create(long value); // 创建信号量 dispatch_semaphore_signal(dispatch_semaphore_t deem); // 发送信号量 dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout); // 等待信号量 dispatch_semaphore_create(
VV木公子
2018/06/05
8.7K0
Semaphore和生产者-消费者模型
这里后面打算出一期,品质比较高的文章系列,分类以语言为主,在这个文章系统里,基本是一个比较热门的知识点或者是一个比较大的知识点,我会复现,然后谈谈自己的理解
废江_小江
2022/12/01
6920
Python并发处理
创建一个线程实例后,需要调用start()让其运行。线程是以系统级别线程的方式执行,由操作系统管理。一旦执行,各个线程独立运行,直到目标函数返回结果,可以使用is_alive()查询一个线程实例是否正在运行。
py3study
2020/01/10
8690
Python:线程、进程与协程(2)—
    上一篇博文介绍了Python中线程、进程与协程的基本概念,通过这几天的学习总结,下面来讲讲Python的threading模块。首先来看看threading模块有哪些方法和类吧。
py3study
2020/01/07
5880
Python:线程、进程与协程(2)—
Python3 多线程
主流操作系统上完成并发的手段有进程和线程,主流的编程语言提供了用户空间的调度:协程。Python 也不例外。
py3study
2020/01/02
8580
python高阶教程-并行编程
本文由腾讯云+社区自动同步,原文地址 https://stackoverflow.club/book/senior_python/parallel/
羽翰尘
2019/11/20
7630
C#学习笔记 线程同步
多个线程同时操作一个数据的话,可能会发生数据的错误。这个时候就需要进行线程同步了。线程同步可以使用多种方法来进行。下面来逐一说明。本文参考了《CLR via C#》中关于线程同步的很多内容。
乐百川
2022/05/05
5930
Java生产者消费者的三种实现
Java生产者消费者是最基础的线程同步问题,java岗面试中还是很容易遇到的,之前没写过多线程的代码,面试中被问到很尬啊,面完回来恶补下。在网上查到大概有5种生产者消费者的写法,分别如下。
xindoo
2021/01/21
2.4K0
java 对线程安全支持有哪些?
同步容器。它的原理是将状态封装起来,并对每个公有方法都实行同步,使得每次只有1个线程能够访问容器的状态。
爬蜥
2024/02/21
1920
Python threading 并发编程
今日推荐:Spring AI再更新:如何借助全局参数实现智能数据库操作与个性化待办管理
繁依Fanyi
2024/11/11
1950
Python 多线程的同步方法
---- 概述 这篇博客是我翻译Python threads synchronization: Locks, RLocks, Semaphores, Conditions, Events and Queues,这篇博客对Python多线程的集中实现同步机制及其遇到的一些问题,说明的淋漓尽致。废话少说,直接撸代码。 这篇文章详细描述了python多线程机制,包括Lock、RLock,Semaphore,Condition,Event and Queue.下面一一通过代码展示了这些同步机制的内部细节。首先,让我
吕海峰
2018/04/03
2.9K0
关于Java并发编程的总结和思考
编写优质的并发代码是一件难度极高的事情。Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的实践后,实现并发编程就有了更多的方案和更好的选择。本文是对并发编程的一点总结和思考,同时也分享了Java 5以后的版本中如何编写并发代码的一点点经验。
Java团长
2018/08/07
5070
Python多线程
线程可以允许程序在同一进程空间中并发运行多个操作。本次主要介绍Python标准库中的多线程模块threading。
职场亮哥
2020/10/10
1.4K0
Qt官方示例-信号量
  生产者将数据写入缓冲区,直到到达缓冲区末尾为止,然后从头开始重新开始,覆盖现有数据。使用者线程读取生成的数据,并将其写入标准错误。
Qt君
2023/03/17
9350
Qt官方示例-信号量
一篇文章理清Python多线程之同步条件,信号量和队列
今天这篇文章大概介绍下python多线程中的同步条件Event,信号量(Semaphore)和队列(queue),这是我们多线程系列的最后一篇文章,以后将会进入python多进程的系列。
南山烟雨
2019/04/30
8600
一篇文章理清Python多线程之同步条件,信号量和队列
相关推荐
信号(二)- 生产者消费者示例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档