考察点
- 1、int变量进行block结构体变量转换
- 2、并发队列执行特点
- 3、巧用FIFO规则获取最终值
美团考题
```objectivec (void)test2 {
dispatch_queue_t queue = dispatch_queue_create(“con”, DISPATCH_QUEUE_CONCURRENT);
__block int a = 0;
while (a<5) {
dispatch_async(queue, ^{
a++;
NSLog(@"当前a = %d",a);
NSLog(@"%@",[NSThread currentThread]);
});
}
NSLog(@”a = %d”,a);
// 利用FIFO规则,往queue的添加一个block任务,也就是在while之后的位置上添加
// while循环过程中,添加了很多block进去queue中
dispatch_async(queue, ^{
NSLog(@"最终a = %d",a);
});
}
结果:a = 5,最终a的值141
结论:a>= 5
因为while循环过程中,异步,会创建线程,a达到5时,证明有5条线程执行完成了,while结束,打印时,其他的线程可能在这个
瞬间也完成了,就会继续修改a的值,导致a的值 >= 5;
2020-12-26 16:15:59.096650+0800 dd[22450:5292459] {number = 6, name = (null)}
2020-12-26 16:15:59.096648+0800 dd[22450:5292454] {number = 4, name = (null)}
2020-12-26 16:15:59.096653+0800 dd[22450:5292460] {number = 3, name = (null)}
2020-12-26 16:15:59.096717+0800 dd[22450:5292452] {number = 7, name = (null)}
2020-12-26 16:15:59.096882+0800 dd[22450:5292374] a = 5
2020-12-26 16:15:59.096896+0800 dd[22450:5292459] {number = 6, name = (null)}
2020-12-26 16:15:59.096926+0800 dd[22450:5292454] {number = 4, name = (null)}
2020-12-26 16:15:59.096934+0800 dd[22450:5292452] {number = 7, name = (null)}
2020-12-26 16:15:59.096949+0800 dd[22450:5292460] {number = 3, name = (null)}
2020-12-26 16:15:59.097067+0800 dd[22450:5292459] {number = 6, name = (null)}
2020-12-26 16:15:59.097142+0800 dd[22450:5292454] {number = 4, name = (null)}
2020-12-26 16:15:59.097440+0800 dd[22450:5292453] {number = 8, name = (null)}
2020-12-26 16:15:59.097549+0800 dd[22450:5292462] {number = 9, name = (null)}
2020-12-26 16:15:59.097632+0800 dd[22450:5292452] {number = 7, name = (null)}
2020-12-26 16:15:59.097631+0800 dd[22450:5292463] {number = 10, name = (null)}
2020-12-26 16:15:59.097911+0800 dd[22450:5292459] {number = 6, name = (null)}
2020-12-26 16:15:59.098116+0800 dd[22450:5292453] {number = 8, name = (null)}
2020-12-26 16:15:59.098316+0800 dd[22450:5292454] {number = 4, name = (null)}
2020-12-26 16:15:59.098484+0800 dd[22450:5292465] {number = 11, name = (null)}
2020-12-26 16:15:59.098498+0800 dd[22450:5292464] {number = 12, name = (null)}
2020-12-26 16:15:59.098578+0800 dd[22450:5292462] {number = 9, name = (null)}
2020-12-26 16:15:59.098773+0800 dd[22450:5292460] {number = 3, name = (null)}
2020-12-26 16:15:59.098987+0800 dd[22450:5292454] {number = 4, name = (null)}
2020-12-26 16:15:59.099186+0800 dd[22450:5292453] {number = 8, name = (null)}
2020-12-26 16:15:59.099795+0800 dd[22450:5292464] {number = 12, name = (null)}
2020-12-26 16:15:59.105990+0800 dd[22450:5292465] {number = 11, name = (null)}
2020-12-26 16:15:59.106708+0800 dd[22450:5292459] {number = 6, name = (null)}
2020-12-26 16:15:59.106943+0800 dd[22450:5292452] {number = 7, name = (null)}
2020-12-26 16:15:59.107010+0800 dd[22450:5292463] {number = 10, name = (null)}
2020-12-26 16:15:59.112562+0800 dd[22450:5292462] {number = 9, name = (null)}
2020-12-26 16:15:59.121854+0800 dd[22450:5292460] {number = 3, name = (null)}
2020-12-26 16:15:59.121951+0800 dd[22450:5292465] {number = 11, name = (null)}
2020-12-26 16:15:59.122075+0800 dd[22450:5292453] {number = 8, name = (null)}
2020-12-26 16:15:59.122186+0800 dd[22450:5292464] {number = 12, name = (null)}
2020-12-26 16:15:59.122318+0800 dd[22450:5292454] {number = 4, name = (null)}
2020-12-26 16:15:59.124280+0800 dd[22450:5292459] {number = 6, name = (null)}
2020-12-26 16:15:59.127519+0800 dd[22450:5292469] {number = 13, name = (null)}
2020-12-26 16:15:59.127607+0800 dd[22450:5292463] {number = 10, name = (null)}
2020-12-26 16:15:59.128039+0800 dd[22450:5292462] {number = 9, name = (null)}
2020-12-26 16:15:59.128058+0800 dd[22450:5292467] {number = 15, name = (null)}
2020-12-26 16:15:59.128082+0800 dd[22450:5292468] {number = 14, name = (null)}
2020-12-26 16:15:59.128552+0800 dd[22450:5292464] {number = 12, name = (null)}
2020-12-26 16:15:59.128818+0800 dd[22450:5292470] {number = 16, name = (null)}
2020-12-26 16:15:59.128818+0800 dd[22450:5292471] {numbe2020-12-26 16:15:59.129910+0800 dd[22450:5292460] {number = 3, name = (null)}
r = 17, name = (null)}
2020-12-26 16:15:59.128961+0800 dd[22450:5292473] {number = 18, name = (null)}
2020-12-26 16:15:59.129022+0800 dd[22450:5292472] {number = 19, name = (null)}
2020-12-26 16:15:59.129207+0800 dd[22450:5292465] {number = 11, name = (null)}
2020-12-26 16:15:59.129207+0800 dd[22450:5292474] {number = 20, name = (null)}
2020-12-26 16:15:59.129206+0800 dd[22450:5292452] {number = 7, name = (null)}
2020-12-26 16:15:59.130090+0800 dd[22450:5292469] {number = 13, name = (null)}
2020-12-26 16:15:59.130617+0800 dd[22450:5292453] {number = 8, name = (null)}
2020-12-26 16:15:59.130691+0800 dd[22450:5292454] {number = 4, name = (null)}
2020-12-26 16:15:59.131080+0800 dd[22450:5292471] {number = 17, name = (null)}
2020-12-26 16:15:59.131134+0800 dd[22450:5292476] {number = 22, name = (null)}
2020-12-26 16:15:59.131149+0800 dd[22450:5292475] {number = 21, name = (null)}
2020-12-26 16:15:59.131351+0800 dd[22450:5292473] {number = 18, name = (null)}
2020-12-26 16:15:59.131529+0800 dd[22450:5292460] {number = 3, name = (null)}
2020-12-26 16:15:59.132222+0800 dd[22450:5292454] {number = 4, name = (null)}
2020-12-26 16:15:59.132732+0800 dd[22450:5292474] {number = 20, name = (null)}
2020-12-26 16:15:59.132373+0800 dd[22450:5292452] {number = 7, name = (null)}
2020-12-26 16:15:59.133023+0800 dd[22450:5292470] {number = 16, name = (null)}
2020-12-26 16:15:59.133333+0800 dd[22450:5292464] {number = 12, name = (null)}
2020-12-26 16:15:59.133894+0800 dd[22450:5292454] {number = 4, name = (null)}
2020-12-26 16:15:59.134356+0800 dd[22450:5292460] {number = 3, name = (null)}
2020-12-26 16:15:59.134896+0800 dd[22450:5292475] {number = 21, name = (null)}
2020-12-26 16:15:59.135002+0800 dd[22450:5292477] {number = 23, name = (null)}
2020-12-26 16:15:59.135018+0800 dd[22450:5292478] {number = 24, name = (null)}
2020-12-26 16:15:59.135135+0800 dd[22450:5292480] {number = 25, name = (null)}
2020-12-26 16:15:59.135161+0800 dd[22450:5292479] {number = 26, name = (null)}
2020-12-26 16:15:59.135458+0800 dd[22450:5292453] {number = 8, name = (null)}
2020-12-26 16:15:59.135618+0800 dd[22450:5292476] {numbe2020-12-26 16:15:59.135987+0800 dd[22450:5292469] {number = 13, name = (null)}
2020-12-26 16:15:59.136309+0800 dd[22450:5292471] {number = 17, name = (null)}
r = 22, name = (null)}
2020-12-26 16:15:59.137072+0800 dd[22450:5292479] {number = 26, name = (null)}
2020-12-26 16:15:59.137372+0800 dd[22450:5292477] {number = 23, name = (null)}
2020-12-26 16:15:59.137691+0800 dd[22450:5292475] {number = 21, name = (null)}
2020-12-26 16:15:59.137957+0800 dd[22450:5292480] {number = 25, name = (null)}
2020-12-26 16:15:59.139765+0800 dd[22450:5292464] {number = 12, name = (null)}
2020-12-26 16:15:59.139475+0800 dd[22450:5292478] {number = 24, name = (null)}
2020-12-26 16:15:59.138417+0800 dd[22450:5292460] {number = 3, name = (null)}
2020-12-26 16:15:59.140054+0800 dd[22450:5292473] {number = 18, name = (null)}
2020-12-26 16:15:59.140672+0800 dd[22450:5292465] {number = 11, name = (null)}
2020-12-26 16:15:59.140367+0800 dd[22450:5292470] {number = 16, name = (null)}
2020-12-26 16:15:59.140978+0800 dd[22450:5292472] {number = 19, name = (null)}
2020-12-26 16:15:59.141502+0800 dd[22450:5292482] {number = 28, name = (null)}
2020-12-26 16:15:59.141451+0800 dd[22450:5292481] {number = 27, name = (null)}
2020-12-26 16:15:59.141519+0800 dd[22450:5292483] {number = 29, name = (null)}
2020-12-26 16:15:59.141623+0800 dd[22450:5292468] {number = 14, name = (null)}
2020-12-26 16:15:59.142396+0800 dd[22450:5292474] {number = 20, name = (null)}
2020-12-26 16:15:59.142177+0800 dd[22450:5292467] {number = 15, name = (null)}
2020-12-26 16:15:59.143156+0800 dd[22450:5292462] {number = 9, name = (null)}
2020-12-26 16:15:59.143863+0800 dd[22450:5292459] {number = 6, name = (null)}
2020-12-26 16:15:59.143360+0800 dd[22450:5292463] {number = 10, name = (null)}
2020-12-26 16:15:59.148161+0800 dd[22450:5292471] {number = 17, name = (null)}
2020-12-26 16:15:59.148161+0800 dd[22450:5292476] {number = 22, name = (null)}
2020-12-26 16:15:59.148445+0800 dd[22450:5292469] {number = 13, name = (null)}
2020-12-26 16:15:59.138827+0800 dd[22450:5292454] {number = 4, name = (null)}
2020-12-26 16:15:59.141366+0800 dd[22450:5292452] {number = 7, name = (null)}
2020-12-26 16:15:59.136596+0800 dd[22450:5292453] {number = 8, name = (null)}
2020-12-26 16:15:59.148716+0800 dd[22450:5292475] {number = 21, name = (null)}
2020-12-26 16:15:59.149543+0800 dd[22450:5292480] {number = 25, name = (null)}
2020-12-26 16:15:59.149772+0800 dd[22450:5292479] {number = 26, name = (null)}
2020-12-26 16:15:59.150042+0800 dd[22450:5292460] {number = 3, name = (null)}
2020-12-26 16:15:59.150389+0800 dd[22450:5292471] {number = 17, name = (null)}
2020-12-26 16:15:59.150779+0800 dd[22450:5292462] {number = 9, name = (null)}
2020-12-26 16:15:59.150999+0800 dd[22450:5292483] {number = 29, name = (null)}
2020-12-26 16:15:59.151193+0800 dd[22450:5292481] {number = 27, name = (null)}
2020-12-26 16:15:59.151716+0800 dd[22450:5292468] {number = 14, name = (null)}
2020-12-26 16:15:59.152240+0800 dd[22450:5292471] {number = 17, name = (null)}
2020-12-26 16:15:59.152657+0800 dd[22450:5292459] {number = 6, name = (null)}
2020-12-26 16:15:59.153417+0800 dd[22450:5292467] {number = 15, name = (null)}
2020-12-26 16:15:59.153757+0800 dd[22450:5292474] {number = 20, name = (null)}
2020-12-26 16:15:59.154266+0800 dd[22450:5292468] {number = 14, name = (null)}
2020-12-26 16:15:59.154699+0800 dd[22450:5292484] {number = 30, name = (null)}
2020-12-26 16:15:59.154828+0800 dd[22450:5292485] {number = 31, name = (null)}
2020-12-26 16:15:59.154845+0800 dd[22450:5292486] {number = 32, name = (null)}
2020-12-26 16:15:59.154910+0800 dd[22450:5292487] {number = 33, name = (null)}
2020-12-26 16:15:59.154917+0800 dd[22450:5292460] {number = 3, name = (null)}
2020-12-26 16:15:59.155266+0800 dd[22450:5292479] {number = 26, name = (null)}
2020-12-26 16:15:59.155556+0800 dd[22450:5292474] {number = 20, name = (null)}
2020-12-26 16:15:59.155957+0800 dd[22450:5292467] {number = 15, name = (null)}
2020-12-26 16:15:59.156346+0800 dd[22450:5292472] {number = 19, name = (null)}
2020-12-26 16:15:59.156749+0800 dd[22450:5292465] {number = 11, name = (null)}
2020-12-26 16:15:59.157077+0800 dd[22450:5292473] {number = 18, name = (null)}
2020-12-26 16:15:59.157434+0800 dd[22450:5292460] {number = 3, name = (null)}
2020-12-26 16:15:59.158869+0800 dd[22450:5292486] {number = 32, name = (null)}
2020-12-26 16:15:59.159036+0800 dd[22450:5292485] {number = 31, name = (null)}
2020-12-26 16:15:59.160262+0800 dd[22450:5292460] {number = 3, name = (null)}
2020-12-26 16:15:59.160524+0800 dd[22450:5292473] {number = 18, name = (null)}
2020-12-26 16:15:59.161035+0800 dd[22450:5292486] {number = 32, name = (null)}
2020-12-26 16:15:59.161434+0800 dd[22450:5292465] {number = 11, name = (null)}
2020-12-26 16:15:59.161654+0800 dd[22450:5292481] {number = 27, name = (null)}
2020-12-26 16:15:59.161838+0800 dd[22450:5292483] {number = 29, name = (null)}
2020-12-26 16:15:59.162034+0800 dd[22450:5292480] {number = 25, name = (null)}
2020-12-26 16:15:59.162427+0800 dd[22450:5292477] {number = 23, name = (null)}
2020-12-26 16:15:59.162990+0800 dd[22450:5292475] {num2020-12-26 16:15:59.163067+0800 dd[22450:5292488] {number = 34, name = (null)}
ber = 21, name = (null)}
2020-12-26 16:15:59.163293+0800 dd[22450:5292490] {number = 35, name = (null)}
2020-12-26 16:15:59.163357+0800 dd[22450:5292489] {number = 36, name = (null)}
2020-12-26 16:15:59.163421+0800 dd[22450:5292469] {number = 13, name = (null)}
2020-12-26 16:15:59.163610+0800 dd[22450:5292477] 最终a = 141
2020-12-26 16:15:59.163497+0800 dd[22450:5292454] {number = 4, name = (null)}
```