-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNSConditionTest.m
More file actions
70 lines (56 loc) · 1.69 KB
/
NSConditionTest.m
File metadata and controls
70 lines (56 loc) · 1.69 KB
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
//
// NSConditionLockTest.m
// WGFcodeNotes
//
// Created by 白菜 on 2022/10/10.
// Copyright © 2022 WG. All rights reserved.
//
#import "NSConditionTest.h"
@interface NSConditionTest()
@property(nonatomic, strong) NSMutableArray *data;
@property(nonatomic, strong) NSCondition *condition;
@end
@implementation NSConditionTest
-(instancetype)init {
self = [super init];
if (self) {
self.data = [NSMutableArray array];
self.condition = [[NSCondition alloc]init];
}
return self;
}
-(void)otherTest {
[[[NSThread alloc]initWithTarget:self selector:@selector(__remove) object:nil] start];
[[[NSThread alloc]initWithTarget:self selector:@selector(__add) object:nil] start];
}
// 有东西才能删除,没有东西就不能删除
/// 添加元素
-(void)__add {
//加锁
[self.condition lock];
sleep(1.0);
[self.data addObject:@"1"];
NSLog(@"add 添加元素");
//唤醒因为wait而等待的线程,代码会继续向下走,signal方法其实可以放在unlock后面(根据具体的业务来决定)
[self.condition signal];
NSLog(@"唤醒锁,开始执行了");
sleep(2.0);
//解锁
[self.condition unlock];
}
/// 删除元素
-(void)__remove{
//加锁
[self.condition lock];
NSLog(@"remove begin");
if (self.data.count == 0) {
// 如果没有数据可以删除,那么线程就会在这个地方睡觉等待,并且会放开这把锁;
// 等待这个条件被放开(signal)后会重新加锁(前提是signal后的锁已经解锁了)
[self.condition wait];
}
[self.data removeLastObject];
NSLog(@"remove 删除元素");
//解锁
[self.condition unlock];
}
@end