这个指针算法真的是线程安全的吗?

本文关键字:安全 线程 指针 算法 真的 | 更新日期: 2023-09-27 18:31:43

我在网上看到了以下关于做指针算术的建议:

IntPtr ptr = new IntPtr(oldptr.ToInt64() + 2);

这真的是线程安全的吗?我想不是,因为ToInt64和加法不是原子的。这就是 中新IntPtr.Add()功能的原因吗。NET4?

http://msdn.microsoft.com/en-us/library/system.intptr.add.aspx

编辑

根据您的精彩评论阅读了线程安全性后,我想我可以澄清我的问题。我担心的是垃圾收集器可能会从我获得指针的值时移动指针,并ToInt64()创建新的IntPtr。所以,我的问题是:

ToInt64()ToInt32()将返回"等于此实例值的 64 位/32 位有符号整数"。(MSDN)。我想这个值是数据的真实地址(指针)。我想如果 GC 碰巧移动数据,此值将不会相应地更新。因此,基于此值创建新的 IntPtr 可能会指向错误的位置。我想您必须使用固定/固定指针来防止这种情况。

这个指针算法真的是线程安全的吗?

通过线程安全,我想您关心的是与对同一变量执行读取-修改-写入周期的多个线程相关的竞争条件。这不是您在问题中的代码中的内容。该代码预计会出现哪些线程问题并不明显。

也许你打算使用的例子是这样的:

IntPtr ptr = ...;
...
ptr = (IntPtr) (ptr.ToInt64() + 2);

现在,该代码不是线程安全的。如果多个线程同时执行读取-修改-写入,则会出现经典的数据争用。

但是,新的 IntPtr.Add 方法也不是线程安全的。新的添加运算符也不是。例如,我的意思是说ptr += 2不是线程安全的。

您需要一个锁或 Interlocked 类来实现线程安全增量。

这就是 中新的 IntPtr.Add() 函数的原因吗。NET4?

只有猜测,但更可能的原因是:

不支持运算符重载或自定义运算符的语言可以使用此方法向指针值添加偏移量。