读取即将在没有同步的情况下同时增加的int是安全的吗?
Is it safe to read an int that is being concurrently incremented without synchronization
我的线程A仅读取int,而线程B仅递增。
我不需要螺纹A即可完全最新的值,在实际上是9时,它可以是8,这是可以的,因为它是一个循环,他会在某个时候达到9。
问题是我有一个固定尺寸的数组,一个存储当前索引的int(通过螺纹a读取最后一个读取)和另一个存储数组"大小"的int。int在0开始,每个更新线程A的外观,如果size int大于索引int,则它会赶上并读取新值。
我想知道我是否可以避免同步,因为我不需要精确的准确性。
no。行为不确定。充其量,您的"不需要精确性"变成"可以忍受荒谬的值"。
假设一个线程刚刚在字节边界上增加了一个值。例如,在具有8位字节的系统上从255到256。在增量之前,高字节具有值0。在增量时,低字节具有值0。因为那是您可以看到的:编写低字节后和编写新字节之前的线程开关会导致另一个线程将两个字节视为零。
Note 这是一个手动的参数,旨在让您对同步解决的问题有一种感觉。这并不是要建议良好的做法。良好的实践需要同步,无论您可能猜测结果如何。
可以安全地读取即将同时增加的int
不,这是不安全的。
种族条件至少涉及一个作家线程。(如果所有线程都是读者线程,则没有种族条件,也不需要锁定)。
在您的情况下,您有两个线程都是两个作者线程(即修改共享资源)。所以有种族条件。您需要将锁定到共享资源(即计数器)安全。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 数组索引的值没有增加
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 为什么我的代码在输出中增加了93天
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 如何增加模板类型 int 参数?
- C :用sizeof()operator在for for loop中增加一个int变量,只能工作一次
- 读取即将在没有同步的情况下同时增加的int是安全的吗?
- 有没有一种方法可以在C++中增加int的大小而不使用long
- 我可以使用cmpxchg16b自动地将指针复制到指针和int,同时增加int(原子引用计数)
- 在可变进模板展开中增加int值的安全方法是什么?
- 如何设置矢量长度增加时的断点<int>?
- 如何增加int的大小