直接贴测试代码了。
当前考虑的问题:
1.队列有多少个消费者
2.添加到队列的新task是同步运行(当前线程阻塞)还是异步(当前线程不阻塞)
3.多个队列之间的调度(此文章未涉及)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
//
// 单线程和多线程并发队列测试(同步和异步)
//
// 基础原理:
// 1)队列:
// 1.1 dispatch_queue_t 是一个队列,一个FIFO的消费队列
// 1.2 消费者:队列配置的运行线程
// 1.3 被消费对象: 添加到队列中的运行任务(block等)
// 1.4 运行任务:将任务放到队列中,等待消费者消费
// 2)同步,异步 (对于任务) (此处的运行指将任务发入到请求队列中)
// 2.1 同步:A任务在运行时,插入B任务,A任务等待B任务运行完才能运行
// 2.2 异步: A任务在运行时,插入B任务,A任务不等待并且继续运行,B任务也运行
// 假设:
// ATask: 运行fooA的Block
// BTask: 运行fooB的Block
//
//
// 总结:
// 不管单线程或多线程,同步或异步,一定要联系请求队列考虑
#import "TestQueueSi.h"
@interface TestQueueSi ()
@property (strong,nonatomic) dispatch_queue_t serialQueue;
@property (strong,nonatomic) dispatch_queue_t concurrentQueue;
@end
@implementation TestQueueSi
- (instancetype)init {
self = [super init];
if (self) {
_serialQueue = dispatch_queue_create( "chenhh.serialQueue" , DISPATCH_QUEUE_SERIAL);
_concurrentQueue = dispatch_queue_create( "chenhh.concurrentQueue" , DISPATCH_QUEUE_CONCURRENT);
}
return self;
}
/**
QUEUE_SERIAL(单线程) 同步
死锁崩溃
1.ATask运行,同步加入BTask
2.BTask加入到请求队列中,可是没有其他空余线程(ATask线程在 等待BTask),BTask等待空余线程,
3.死锁发生
*/
- ( void )testSerialQueueSync {
dispatch_sync(_serialQueue,^{
[self fooA];
dispatch_sync(_serialQueue,^{
[self fooB];
});
[self fooA];
});
}
/**
QUEUE_CONCURRENT(多线程) 同步
正常运行
1.ATask运行,同步加入BTask,Atask线程等待
2.BTask加入到请求队列中,有其他空余线程(ATask线程在等待BTask),BTask运行
3.BTask运行结束,ATask停止等待,继续运行
*/
- ( void )testConcurrentQueueSync {
dispatch_sync(_concurrentQueue,^{
[self fooA];
NSLog(@ "first" );
// 同步 需要等待运行结果
dispatch_sync(_concurrentQueue,^{
[self fooB];
});
// 等待同步代码完成,再运行
[self fooA];
});
}
/*
QUEUE_SERIAL(单线程) 异步
正常
1.ATask运行,异步加入BTask,Atask线程继续运行不等待
2.BTask加入到请求队列中,没有其他空余线程(ATask线程在正常运行),BTask等待空余
3.ATask运行完成,线程空出,BTask运行
*/
- ( void )testSerialQueueAsync {
dispatch_async(_serialQueue,^{
[self fooA];
dispatch_async(_serialQueue,^{
[self fooB];
});
[self fooA];
});
}
/**
QUEUE_CONCURRENT(多线程) 异步
正常运行
1.ATask运行,同步加入BTask,Atask线程继续运行不等待
2.BTask加入到请求队列中,有其他空余线程(ATask等线程在正常运行),BTask运行(ABTask同时运行)
*/
- ( void )testConcurrentQueueAsync {
dispatch_async(_concurrentQueue,^{
[self fooA];
// 同步 需要等待运行结果
dispatch_async(_concurrentQueue,^{
[self fooB];
});
// 等待同步代码完成,再运行
[self fooA];
});
}
- ( void )fooA {
NSLog(@ " ************ fooA ************ " );
}
- ( void )fooB {
NSLog(@ " ************ fooB ************ " );
}
@end
|
相关文章
猜你喜欢
- 64M VPS建站:是否适合初学者操作和管理? 2025-06-10
- ASP.NET自助建站系统中的用户注册和登录功能定制方法 2025-06-10
- ASP.NET自助建站系统的域名绑定与解析教程 2025-06-10
- 个人服务器网站搭建:如何选择合适的服务器提供商? 2025-06-10
- ASP.NET自助建站系统中如何实现多语言支持? 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-25 27
-
2025-05-27 84
-
2025-06-04 40
-
2025-06-05 27
-
2025-05-25 27
热门评论