所以我不确定它是属于这里还是属于“Code Review”,但我认为这更像是一个问题比什么都重要所以我决定在这里发布。
我正在阅读dispatch_once_t
和dispatch_once()
,我不禁想到......
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//do stuff
});
是...
的过于复杂的陈述static BOOL ranOnce = NO;
if (!ranOnce) {
//do stuff
ranOnce = YES;
}
我的问题是,使用其中一个有什么好处?如果是这样,我应该在什么情况下使用什么?
答案 0 :(得分:1)
第一个在多线程环境中工作。
对于第二个,请考虑如果两个线程在其中一个线程到达if (!ranOnce) {
之前到达ranOnce = YES;
会发生什么。
答案 1 :(得分:1)
前者即使在多线程环境中也能正常工作。如this blog post中所述:
在单线程世界中,这个调用会很无聊,可以用简单的
if
语句替换。但是,我们生活在一个多线程的世界中,dispatch_once
是线程安全的。保证从多个线程多次同时调用dispatch_once
只执行一次块,所有线程将等到执行完成dispatch_once
之前。即使这不是很难自己完成,但是dispatch_once
也非常快,而且这很难实现。