Ios 为什么GCD不起作用?

Ios 为什么GCD不起作用?,ios,grand-central-dispatch,deadlock,Ios,Grand Central Dispatch,Deadlock,为什么遵循GCD不起作用?所有子线程都在\uulock\uwait处暂停,但没有死锁 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, ^{ NSLo

为什么遵循GCD不起作用?所有子线程都在
\uulock\uwait
处暂停,但没有死锁

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");
dispatch\u queue\u t queue=dispatch\u queue\u create(“test\u gcd\u queue”,dispatch\u queue\u CONCURRENT”);
对于(int i=0;i<10000;i++)
{
调度异步(队列^{
调度同步(队列^{
NSLog(@“----gcd:%d”,i);
});
});
//NSLog(@“------------async over:%d”,i);//有这个,好吗。
}
NSLog(@“---------------循环结束”);

这无法工作,因为内部
dispath\u sync()
使用它运行的同一队列。它的块必须等待队列中的最后一项执行。由于当前代码在队列中,这是一个死锁,因为
dispatch\u sync()
等待其周围块的终止

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

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


如果要在外循环中插入一个小延迟(例如1ms),则应该缓解甚至消除这种阻塞。

定义“不工作”。我不这么认为。调度队列\u并发队列没有像您所说的那样工作。我认为这个问题与线程配额有关。@fyxrhyry:我已经针对多线程的情况扩展了我的帖子。