Int64(长)和线程安全

时间:2010-08-02 02:42:00

标签: c# multithreading msdn

来自MSDN的引用

  

在所有硬件平台上分配此类型的实例并非线程安全,因为该实例的二进制表示可能太大而无法在单个原子操作中进行分配。

是否意味着像Itianium或x86-64这样的64位处理器上的Thead-safe呢?

例如:

long data = GetData();
// some parallel task on data

可能有问题吗?

5 个答案:

答案 0 :(得分:2)

可能,但为什么你会编写一个程序,在某些英特尔工作平台上是线程安全的,而不是其他平台?请注意,DecimalDouble类型也有关于线程安全的免责声明。

Microsoft建议在这些情况下使用锁。这里有关于并发,内存映射和低级锁的一些好信息的链接:

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/f03ea3c9-4c2b-4a79-8f8c-4a6b7476b20d

答案 1 :(得分:1)

如果内存加载/存储操作是在对齐的内存地址上放置且不大于本机机器大小指针的内存块上执行的,则它们被视为原子操作。
意思是,在对齐的内存地址上的64位加载/存储操作在64位平台上将是原子的,但在32位平台上它不是原子的。

现代处理器提供了一组特殊的指令(在.Net中,大多数都是通过Interlocked类公开的)。允许在加载/存储操作上实现大于机器本机指针大小的原子性(32位处理器上的64位操作和64位处理器上的128位操作。后者不会被Interlocked类公开,但是以本机代码提供。)

有关详细信息,请查看Joe Duffy的帖子:Thread-safety, torn reads, and the like

答案 2 :(得分:0)

如果您的data变量被来自不同线程的代码直接访问,则会出现问题。

他们不保证任何特定的系统,所以为了安全起见,我认为它不是x64系统上的线程安全以及x86,但我怀疑他们真正想到的是像运行的紧凑框架这样的地方智能手机。

答案 3 :(得分:0)

我会在安全方面犯错并假设没有。

注意this上一个问题。基本上,对于Int64的原子分配,您应该查看使用Interlocked类。

还可以查看this link以获得更详细的分析。特别是,请查看标有“Atomicity and Interlocked”的部分。

答案 4 :(得分:0)

问题的关键在于Int64不是 guarenteed 是原子的,但这并不妨碍它在某些情况下是如此。换句话说,Int64在64位系统上将是原子的。当然,这并不意味着它必然是线程安全的。除了原子性之外,还有其他与线程安全有关的问题。例如,为了防止陈旧性问题,您必须使用适当的内存屏障指令(volatileThread.VolatileWrite等。)