gpt4 book ai didi

c# - 这个指针算术真的是线程安全的吗?

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

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

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/

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