Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Objective-C中,大中心调度保证了什么行为?_Ios_Objective C_Multithreading_Grand Central Dispatch - Fatal编程技术网

Ios 在Objective-C中,大中心调度保证了什么行为?

Ios 在Objective-C中,大中心调度保证了什么行为?,ios,objective-c,multithreading,grand-central-dispatch,Ios,Objective C,Multithreading,Grand Central Dispatch,我认为问这个问题的最好方法是使用一些代码: //Main method for(int i = 0; i < 10; i++) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [self foo:i]; }); } - (void) foo: (int) i { @synchronized(self) {

我认为问这个问题的最好方法是使用一些代码:

//Main method
for(int i = 0; i < 10; i++)
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         [self foo:i];
    });

}

- (void) foo: (int) i
{
    @synchronized(self)
    {
        NSLog(@"%d",i);
    }
}
//Main方法
对于(int i=0;i<10;i++)
{
调度异步(调度获取全局队列(调度队列优先级默认为0)^{
[自福:我];
});
}
-(void)foo:(int)i
{
@同步(自)
{
NSLog(@“%d”,i);
}
}
在这种情况下,是否保证按顺序打印数字0-9?是否有可能跳过正在运行队列上等待的某个线程?现实中呢。现实地说,这会发生吗?如果我想要上面的行为(仍然使用线程),该怎么办;我怎样才能做到这一点

在这种情况下,是否保证打印数字0-9 按顺序离开

没有

是否有可能某个线程正在等待 运行队列,是否将跳过

不清楚“跳过”是什么意思。如果它的意思是“块是否按顺序执行?”那么答案是“可能,但这是一个实现细节”

现实中呢。现实地说,这会发生吗

无关紧要。如果您是基于对实际实现细节的假设来编写并发代码,那么您编写的并发代码是不正确的

如果我想要上面的行为(仍然使用线程),该怎么办;我怎么能 做到这一点


创建一个串行分派队列,并按照需要执行的顺序分派到该队列。请注意,这比
@synchronized()
要快得多(当然,
@synchronized()
无论如何都不适用于您,因为它不保证顺序,而仅仅是排他性)。

来自dispatch\u get\u global\u queue的文档

提交到这些全局并发队列的块可以彼此并发执行


这就意味着没有任何保证。您正在向队列传递一个代码块,队列从那里获取它

线程和GCD块不会被“跳过”。如果线程抛出异常,如果没有显式的try-catch,您永远不会知道,因为GCD放弃了异常处理。请您解释一下,为什么不?来自Apple docs:“并发队列(也称为一种全局调度队列)并发执行一个或多个任务,但任务仍按添加到队列中的顺序启动。”这难道不意味着,将满足该顺序吗?它们将按添加的顺序启动,但是线程调度可能意味着它们不能按相同的顺序完成执行。例如,“启动任务”可能涉及旋转一个新线程,而下一个“启动任务”可能会回收第一个线程旋转时刚刚可用的线程。再加上由于锁定不同的子系统(例如malloc)而产生的任何不可预测的行为,最好不要假设任何关于执行顺序的事情。为了给出这个令人敬畏的答案,我想指出,此外,您可以使用dispatch\u barrier\u async()要在并发队列上发布操作,您需要自己创建(不是全局队列之一)来发布仅在所有先前调度的块完成后才执行的块。