gpt4 book ai didi

ios - 如何使用 GCD 进行资源的轻量级事务锁定?

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:11:21 26 4
gpt4 key购买 nike

我正在尝试使用 GCD 来替代许多原子属性。我记得在 WWDC 上他们谈到 GCD 可以用于高效的事务锁定机制。

在我的 OpenGL ES runloop 方法中,我将所有绘图代码放在由 dispatch_sync 在自定义创建的串行队列上执行的 block 中。 runloop 由 CADisplayLink 调用,据我所知,这是在主线程上发生的。

有些变量和属性既用于绘图,也用于控制将要绘制的内容。问题是必须有一些锁定来防止并发问题,以及一种从两个绘制帧之间的主线程事务性查询和修改 OpenGL ES 场景状态的方法。

我可以通过在该串行队列上执行一个 block ,以事务方式使用 GCD 修改一组属性。

但似乎我无法使用 GCD 将值读入主线程,同时阻塞执行绘图代码的队列。 dispatch_synch 没有返回值,但我想在读取和写入的两帧绘图之间访问表示值。

他们谈论的是这个障碍吗?它是如何工作的?

最佳答案

这就是异步写入器/同步读取器模型旨在实现的目的。假设您有一个 ivar(为了便于讨论,我们假设您已经更进一步并将所有 ivar 封装到一个结构中,只是为了简单起见:

struct {
int x, y;
char *n;
dispatch_queue_t _internalQueue;
} myIvars;

让我们进一步假设(为简洁起见)您已经在 dispatch_once() 中初始化了 ivar,并在代码的前面使用 dispatch_queue_create() 创建了 _internalQueue 作为串行队列。

现在,写入一个值:

dispatch_async(myIvars._internalQueue, ^{ myIvars.x = 10; });
dispatch_async(myIvars._internalQueue, ^{ myIvars.n = "Hi there"; });

阅读一个:

__block int val; __block char *v;
dispatch_sync(myIvars._internalQueue, ^{ val = myIvars.x; });
dispatch_sync(myIvars._internalQueue, ^{ v = myIvars.n; })

使用内部队列确保一切都被适本地序列化,并且写入可以异步发生,但读取等待所有挂起的写入完成,然后再返回值。许多“GCD 感知”数据结构(或具有内部数据结构的例程)将串行队列作为实现细节用于此目的。

关于ios - 如何使用 GCD 进行资源的轻量级事务锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12602224/

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