- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个“静态 64 位整数变量”,它仅由一个线程更新。所有其他线程仅从中读取。
出于安全原因,我是否应该使用原子操作(例如“__sync_add_and_fetch”)来保护这个变量?
还是可以直接从(resp.to)读取(resp.write)?
我仍然很困惑,因为我没有找到明确的答案。我不知道我是否必须保护它:
谢谢。
最佳答案
通常,读取和写入存储位置的原子性是相同的。
也就是说,如果一个位置不能被原子写入,它也不能被原子读取,反之亦然。
如果需要特殊的原子写入,除非读取也是原子的,否则使用它是没有意义的。
例如,假设正在使用普通读取读取 64 位位置,这需要两次 32 位访问。假设写入发生在这两个访问之间。读取将从新值中获取第二个 32 位,并将其与过时的前 32 位组合。写入不能介于读取的两半之间的唯一方法是读取是原子的。原子读知道如何正确地与原子写交互以防止这种情况。
您可能会对这条规则的“异常(exception)”感到困惑。在某些系统中,您可能会看到原子更新(例如增量)与普通读取混合在一起。这是基于读取和写入实际上是原子的假设;特殊的原子增量仅用于使读取/修改/写入周期从并发写入者的角度来看是不可分割的:如果 N 个写入者大约同时执行此增量,则它确保位置增加 N。
有时您可能还会看到使用普通读取的正确优化,即使底层数据类型不是原子访问的。在这种情况下,算法并不关心它读取的是“半生不熟”的值。
例如,为了简单地监视内存位置以检测更改,您不需要原子读取。检测更改不需要检索正确的值。例如 0x00000000 更新为 0x00010001,但非原子读取观察到中间值 0x00010000,这仍然足以检测位置已更改。
如果您必须确保读者永远不会看到半生不熟的值,那么请使用原子读写。
还有其他问题,比如排序。假设作者更新了两个位置,A 和 B。在某些计算系统中,读者可能会在 A 之前观察到 B 的更新。除了任何原子操作之外,还必须使用特殊的“barrier”或“fence”指令更新说明。
在高级语言中,这些屏障的 API 可能内置于某些原子操作的语义中,因此您最终可能会为了这些屏障而使用原子指令,即使数据在其他方面是原子的.
关于C - 访问整数变量时的安全性 : 1 writer, N 读者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29884735/
我无法理解为什么第一个读者-作者问题会导致写进程饿死,即:代码如何为读者进程提供优先级?当其中一个读取进程执行 signal(wrt) 时,写入进程是否应该无法获得锁定?是信号量列表的结构(正如我所看
我正在使用R处理人口普查数据,该数据使用了很长的数字GEOID来标识地理位置。我面临的问题是,当使用write_csv(来自readr包)写出处理后的数据时,正在以科学计数法编写这些GEOID。有办法
我为 Java 中的读写器问题开发了一个解决方案(有关此的一些信息 http://lass.cs.umass.edu/~shenoy/courses/fall08/lectures/Lec11.pdf
以下代码是Java中的Passing the Baton程序的一部分: 主要 P1(作家) P2(作家) P3(阅读器) P4(阅读器) 主要(); package ReadersPreference
我正在使用 ReaderWriterLockSlim保护一些操作。我想偏爱读者而不是作者,这样当读者长时间持有锁并且作者试图获取写锁时,进一步的读者不会被作者的尝试阻塞(如果作者在 lock.Ente
我觉得这可能是一种非常普遍和常见的情况,存在众所周知的无锁解决方案。 简而言之,我希望有像读者/作者锁这样的方法,但这不需要读者获取锁,因此可以获得更好的平均性能。 相反,读者需要一些原子操作(128
我遇到了读者-作者问题。我想写出作家喜欢使用互斥锁的解决方案。到目前为止我已经写了这个 #include #include #include #include #include #inclu
这个程序读取“电子邮件”(实际上只是一个像电子邮件一样结构的 .txt 文件)并用它做各种事情(在 map 中存储数据并对其进行操作)。 但是,我在根据主题搜索输出电子邮件的“消息”时遇到了一个不寻常
我正在从 UIWebView 切换到 WKWebView,不知道如何设置我的配置以使用 Reader. 有没有人可以帮助我? viewDidLoad: WKWebViewConfiguration *
我正在练习 Visual Basic 编程我在 Visual Basic 中有两种形式。第一个表单有一个命令按钮,将显示第二个表单的输入数据第二种形式有一个文本框,我需要在其中输入数据并保存它。 我在
我想寻求有关此任务的帮助。 我的任务是用 C 编写一个简单的程序来模拟读写器问题。程序要求是: 程序启动后,会要求用户输入作者和读者的输入次数。 程序会不断通知用户线程的状态。 程序结束后,小统计(每
我有一个用 C 语言模拟读者-作者问题的简单程序。要求用户输入作者数和读者数。然后创建随机数的编写器 - 线程和读取器 - 线程。项目的写入由全局变量 itemsCount 模拟 - 它代表新插入项目
我有一个“静态 64 位整数变量”,它仅由一个线程更新。所有其他线程仅从中读取。 出于安全原因,我是否应该使用原子操作(例如“__sync_add_and_fetch”)来保护这个变量? 还是可以直接
我是一名优秀的程序员,十分优秀!