作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在网上看到了以下关于进行指针算术的建议:
IntPtr ptr = new IntPtr(oldptr.ToInt64() + 2);
这真的是线程安全的吗?我想不是,因为 ToInt64
并且加法不是原子的。这就是 .NET4 中新的 IntPtr.Add()
函数的原因吗?
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
类来实现线程安全递增。
关于c# - 这个指针算术真的是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18873256/
我是一名优秀的程序员,十分优秀!