IOS开发-多线程队列测试代码

2025-05-29 0 79

直接贴测试代码了。

当前考虑的问题:
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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 IOS开发-多线程队列测试代码 https://www.kuaiidc.com/89496.html

相关文章

发表评论
暂无评论