【问题标题】:BOOL vs. dispatch_once_tBOOL 与 dispatch_once_t
【发布时间】:2014-10-22 17:52:15
【问题描述】:

所以我不确定它是属于这里还是属于“代码审查”,但我认为这更像是一个事情如何运作的问题,所以我决定在这里发帖。

我正在阅读有关 dispatch_once_tdispatch_once() 的信息,我不禁认为...

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    //do stuff
});

对于...来说是一个过于复杂的陈述

static BOOL ranOnce = NO;
if (!ranOnce) {
    //do stuff
    ranOnce = YES;
}

我的问题是使用其中一种有什么好处?如果是这样,我应该在什么情况下使用什么?

【问题讨论】:

    标签: objective-c boolean


    【解决方案1】:

    前者即使在多线程环境中也能正常工作。如this blog post中所述:

    在单线程世界中,这个调用会有点无聊,可以用简单的if 语句代替。然而,我们生活在一个多线程的世界中,dispatch_once 是线程安全的。保证从多个线程对dispatch_once 的多个同时调用只会执行一次该块,并且所有线程将等待直到执行完成,然后dispatch_once 返回。即使这不是你自己很难完成的,但dispatch_once 也非常快,而且真的很难做到。

    【讨论】:

      【解决方案2】:

      第一个在多线程环境中工作。

      对于第二个,考虑如果两个线程在其中一个线程到达ranOnce = YES; 之前到达if (!ranOnce) { 会发生什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-07
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 2017-12-04
        • 1970-01-01
        • 1970-01-01
        • 2020-12-12
        相关资源
        最近更新 更多