【发布时间】:2010-11-10 21:58:21
【问题描述】:
我试图了解在线程(或共享内存)环境中不锁定共享变量的危害。很容易争辩说,如果您对一个变量执行两个或多个相关操作,那么首先持有一些锁很重要。典型的例子是自增操作,先读取当前值,然后加一再写回。
但是,如果您只有一个写入器(和很多读取器)并且写入不依赖于先前的值怎么办。所以我有一个线程每秒存储一次时间戳偏移量。偏移量保存本地时间和其他时间基准之间的差异。许多读者使用这个偏移量来为事件添加时间戳,并且每次获得一个读锁有点昂贵。在这种情况下,我不在乎读者是在写入之前还是之后获得值,只要读者没有得到垃圾(这是一个从未设置的偏移量)。
假设变量是一个 32 位整数。是否有可能在写入过程中对变量进行垃圾读取?还是写一个 32 位整数是一个原子操作?它取决于操作系统或硬件吗? 32 位系统上的 64 位整数怎么样?
共享内存而不是线程呢?
【问题讨论】:
-
“共享内存”不能替代“线程”。可能您唯一的选择是消息传递而不是共享内存,在这种情况下,每个线程都有自己的时间戳,每当他们收到消息时都会更新。消息传递有很多线程安全算法(AFAIK,每个操作系统都提供一个)。
标签: multithreading thread-safety