读取即将在没有同步的情况下同时增加的int是安全的吗?

Is it safe to read an int that is being concurrently incremented without synchronization

本文关键字:增加 int 安全 情况下 同步 读取      更新时间:2023-10-16

我的线程A仅读取int,而线程B仅递增。

我不需要螺纹A即可完全最新的值,在实际上是9时,它可以是8,这是可以的,因为它是一个循环,他会在某个时候达到9。

问题是我有一个固定尺寸的数组,一个存储当前索引的int(通过螺纹a读取最后一个读取)和另一个存储数组"大小"的int。int在0开始,每个更新线程A的外观,如果size int大于索引int,则它会赶上并读取新值。

我想知道我是否可以避免同步,因为我不需要精确的准确性。

no。行为不确定。充其量,您的"不需要精确性"变成"可以忍受荒谬的值"。

假设一个线程刚刚在字节边界上增加了一个值。例如,在具有8位字节的系统上从255到256。在增量之前,高字节具有值0。在增量时,低字节具有值0。因为那是您可以看到的:编写低字节后和编写新字节之前的线程开关会导致另一个线程将两个字节视为零。

Note 这是一个手动的参数,旨在让您对同步解决的问题有一种感觉。这并不是要建议良好的做法。良好的实践需要同步,无论您可能猜测结果如何。

可以安全地读取即将同时增加的int

不,这是不安全的。

种族条件至少涉及一个作家线程。(如果所有线程都是读者线程,则没有种族条件,也不需要锁定)。

在您的情况下,您有两个线程都是两个作者线程(即修改共享资源)。所以有种族条件。您需要将锁定到共享资源(即计数器)安全。