gpt4 book ai didi

multithreading - 在线程环境中不保护共享变量的危险

转载 作者:行者123 更新时间:2023-12-03 13:15:44 25 4
gpt4 key购买 nike

我试图了解在线程(或共享内存)环境中不锁定共享变量的危害。容易争论的是,如果您要对一个变量执行两个或多个相关操作,那么首先要持有一些锁定很重要。典型的示例是增量操作,该操作首先读取当前值,然后再加一个并回写。

但是,如果您只有一名作家(和许多读者)并且写不依赖于先前的值,该怎么办。所以我有一个线程每秒存储一次时间戳偏移。偏移量保留了本地时间与其他时基之间的时差。许多读者都使用此偏移量来为事件加时间戳,每次获取读锁定都有些昂贵。在这种情况下,我不在乎读取器是在写入之前还是在写入之后才获得值,只要读取器不会产生垃圾(这是从未设置的偏移量)即可。

假设该变量是32位整数。是否有可能在写入过程中对变量进行无用读取?还是写32位整数是原子操作?它取决于操作系统还是硬件? 32位系统上的64位整数呢?

共享内存而不是线程呢?

最佳答案

如果8位,16位或32位读/写与它的大小对齐(在486及更高版本上)且未对齐但在高速缓存行内(在P6及更高版本上),则保证是原子的。大多数编译器将保证堆栈变量(假定为C/C++,是局部变量)是对齐的。

如果对齐(在Pentium和更高版本上),则保证64位读/写是原子的,但是,这依赖于编译器生成一条指令(例如,从FPU弹出64位浮点数或使用MMX) )。我希望大多数编译器将使用两个32位访问来实现兼容性,尽管当然可以检查(反汇编)并且可以强制执行不同的处理。

下一个问题是缓存和内存防护。但是,忽略这些值的结果是,即使已更新旧值,某些线程也可能会看到旧值。该值将不会失效,仅是过时的(可能是几微秒)。如果这对您的应用程序很关键,则您必须进行更深入的研究,但是我怀疑是这样。

(来源:Intel Software Developer Manual Volume 3A)

关于multithreading - 在线程环境中不保护共享变量的危险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4149524/

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