gpt4 book ai didi

ios - 为什么GCD不起作用?

转载 作者:行者123 更新时间:2023-12-01 19:44:52 26 4
gpt4 key购买 nike

为什么取消GCD无效?所有子线程都在__ulock_wait处暂停,但没有死锁。

dispatch_queue_t queue = dispatch_queue_create("test_gcd_queue", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 10000; i++)
{
dispatch_async(queue, ^{
dispatch_sync(queue, ^{
NSLog(@"---- gcd: %d", i);
});
});
//NSLog(@"---------- async over: %d", i); //Have this, OK.
}
NSLog(@"-------------------- cycle over");

最佳答案

这是行不通的,因为内部dispath_sync()使用了与之相同的队列。它的块必须等待,直到队列中的最后一项被执行。由于当前代码在队列中,因此这是一个死锁,因为dispatch_sync()等待其周围块的终止。

在并发队列上,如果启动的任务多于队列中的线程,则可能具有相同的效果。每个循环迭代需要两个线程。如果在执行过程中的某个时刻,所有线程在dispatch_sync()开始时被异步任务阻塞,则没有同步任务有机会启动,因此没有异步任务有机会完成。

代码中的循环将非常快速地创建大量异步任务。由于每个任务的启动开销,它们阻塞了队列。因此,只有少数几个同步任务有机会启动并让它们的异步任务完成。

如果要在外部循环中插入一个小的延迟(例如1毫秒),则应减轻甚至消除这种阻塞。

关于ios - 为什么GCD不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49573173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com