gpt4 book ai didi

Cocoa:以最轻量级的方式同步访问 double?

转载 作者:太空狗 更新时间:2023-10-29 15:55:37 25 4
gpt4 key购买 nike

在我的 Cocoa/iOS 应用程序中,我有一个静态的 double 变量(我们称它为 foo),它必须是:

  1. 由我的应用程序的一部分在后台线程上更新
  2. 在主线程上被我的应用程序的另一部分读取

我正在寻找同步访问 foo 的最轻量级方法。

注意:我知道在这些情况下最简单的解决方案通常是调整代码,以便只有一个线程访问变量,因此不需要同步。假设我已经确定在这种情况下限制 foo 访问单个线程是不可能的(也许在步骤 1 中采取的操作发生得如此之快/经常以至于线程切换不可取)。请不要用“restrict foo access to one thread”的回答来回应。我正在寻找替代方案。


我目前的理解是,使用 volatile 变量是同步访问 foo 的最轻量级方法。所以 foo 声明如下:

static volatile double foo = 60.0;

后台线程写代码是这样的:

foo = 90.0;

主线程读取代码是这样的:

double bar = 0.0;
bar = foo;
// use bar here …


一些问题:

  1. foo 写入后台线程后,主线程是否保证能看到更新后的值(假定 foo 被声明为 volatile)? IOW,我是否做了足够的工作来确保这两个线程将看到彼此的读/写操作的结果?
  2. 我假设在这种情况下使用 volatile 作为 double 值更快/更轻量级/更可取,而不是像 @ 这样的互斥锁synchronized block 或 NSLock。真的吗? IOW,volatile 是针对这种特殊情况的最佳解决方案吗?

最佳答案

1) volatile在这里不能替代原子原语。接近,但不完全是。

2) volatile 的问题是的,正如您现在所知,它不正确

理想:您可能可以访问最新的原子语言功能,例如 _Atomic对于 C11 和/或 <atomic>在 C++11 中。

如果不是,则可以使用 64 位整数和原子函数,按值读取,然后传输到 double ,或者您可以使用简单的 pthread_mutex_t甚至可能是自旋锁(使用自旋锁时要非常小心)。

但是……如果可以的话,将值的更改简单地发布到主线程的运行循环中可能会更好。

关于Cocoa:以最轻量级的方式同步访问 double?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12096673/

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