dispatch_once 允许开发者在线程安全的执行且只有一次指定任务
使用代码
+ (QDispatchQueue *)hightGlobalQueue{
static QDispatchQueue *queue;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
queue = [[QDispatchQueue alloc] initWithQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) concurrentCount:(NSUInteger)kDefaultConcurrentCount];
});
return queue;
}
源码:
void dispatch_once(dispatch_once_t *predicate, DISPATCH_NOESCAPE dispatch_block_t block);
void
_dispatch_once(dispatch_once_t *predicate,
DISPATCH_NOESCAPE dispatch_block_t block)
{
//判断是否是首次
if (DISPATCH_EXPECT(*predicate, ~0l) != ~0l) {
//首次就创建
dispatch_once(predicate, block);
} else {
//不是首次那句阻塞
dispatch_compiler_barrier();
}
DISPATCH_COMPILER_CAN_ASSUME(*predicate == ~0l);
}
}
#define DISPATCH_EXPECT(x, v) __builtin_expect((x), (v))
__builtin_expect((x), (v))函数的意思就是X和V相等的几率很大,cpu流水钱可以减少cpu等待取指令的耗时,从而提高cpu的效率。
#define DISPATCH_COMPILER_CAN_ASSUME(expr) __builtin_assume(expr)
__builtin_assume(expr) expr是一个bool类型变量
__builtin_assume
is used to provide the optimizer with a boolean invariant that is defined to be true.
__builtin_assume 常被用于优化器,这个优化器是已被确认是true的bool变量。