gpt4 book ai didi

ios - GCD debugDescription of serial queue value of locked key?

转载 作者:行者123 更新时间:2023-11-29 10:50:08 25 4
gpt4 key购买 nike

我使用 GCD 在 SQL 数据库上执行大量数据提交和数据读取操作,我创建了串行队列并使用 dispatch_async 执行操作。

队列创建代码:

  self.dataBaseQueue = dispatch_queue_create("com.myAPP.dataBaseQueue", DISPATCH_QUEUE_SERIAL);

执行代码

  dispatch_async(self.dataBaseQueue, codeblock);

代码块包含数据库操作读取或写入。

现在,当我记录队列的 debugDescription 时,它正在打印

OS_dispatch_queue: com.myAPP.dataBaseQueue[0x1cd58ae0] = { xrefcnt = 0x1, refcnt = 0x1, suspend_cnt = 0x0, **locked = 0**, target = com.apple.root.default-overcommit-priority[0x3d335300], width = 0x0, running = 0x0, barrier = 0 }

经过一些操作后它正在打印

OS_dispatch_queue: com.myAPP.dataBaseQueue[0x1cd58ae0] = { xrefcnt = 0x1, refcnt = 0x1, suspend_cnt = 0x0, **locked = 1**, target = com.apple.root.default-overcommit-priority[0x3d335300], width = 0x0, running = 0x0, barrier = 0 }

那么 locked =1locked =0 是什么意思?

最佳答案

正如 yurish 指出的那样,资源是可用的,但无论如何“让我为你谷歌一下”,并添加一些(希望有用的)分析。

首先,一些背景......在object_internal.h您可以找到以下 #define:

#define DISPATCH_OBJECT_SUSPEND_LOCK            1u
#define DISPATCH_OBJECT_SUSPEND_INTERVAL 2u
#define DISPATCH_OBJECT_SUSPENDED(x) \
((x)->do_suspend_cnt >= DISPATCH_OBJECT_SUSPEND_INTERVAL)

这表明单个值将与这些 #define 一起使用,以便让它作为锁定位(在 LSB 中)和暂停计数(在其余部分。)

然后,在object.c我们可以看到这个调试消息业务到底是在哪里实现的:

size_t
_dispatch_object_debug_attr(dispatch_object_t dou, char* buf, size_t bufsiz)
{
return snprintf(buf, bufsiz, "xrefcnt = 0x%x, refcnt = 0x%x, "
"suspend_cnt = 0x%x, locked = %d, ", dou._do->do_xref_cnt + 1,
dou._do->do_ref_cnt + 1,
dou._do->do_suspend_cnt / DISPATCH_OBJECT_SUSPEND_INTERVAL,
dou._do->do_suspend_cnt & 1);
}

果然,我们看到suspend_cnt对应dou._do->do_suspend_cnt/DISPATCH_OBJECT_SUSPEND_INTERVALlocked对应dou。 _do->do_suspend_cnt & 1 所以很容易得出结论,是的,do_suspend_cnt 正在执行上述 #define 暗示的双重职责。

现在,无需深入了解太多细节,我们可以在源代码中观察到 do_suspend_cnt 仅在 queue.c 中的少数几个地方被引用。 .它在队列结构的初始化中提到。它也被 barrier 调用使用,但仅在通过 DISPATCH_OBJECT_SUSPEND_INTERVAL 递增和递减它时使用,所以这并不有趣(至少对于锁定位而言不是这样 - 一个可能会认为有趣的是,屏障调度是通过暂停队列直到屏障调用返回来实现的,但这不是 OP 所要求的)。

我看到的其余提及是在 _dispatch_wakeup 中,它似乎在从队列中取出下一个工作项目之前自动设置锁定位(有道理,对吧?不要从队列中取出东西同时从多个地方)然后再次在 _dispatch_queue_invoke 中减去锁定位,似乎是为了平衡它在 _dispatch_wakeup 中的设置。最后,我们看到它在 _dispatch_queue_cleanup2 中提到,它(表面上)看起来像是主调度队列的一次性拆卸工作。

就是这样。调试描述中 locked = 的出现暴露了 libdispatch 似乎用来保护其内部数据结构免受并发突变影响的内部锁定位的状态。作为 libdispatch 的用户,这可能对您没有任何影响。

关于ios - GCD debugDescription of serial queue value of locked key?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20797145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com