c# - 这是实现线程安全读/写 Guid 属性的正确方法吗?

标签 c# thread-safety

我正在实现一个将被多个线程同时使用的类。大多数属性获取和设置原始类型,这些类型可以由 Interlocked 类正确处理。该类包括一个 Guid 属性。这不是以线程安全方式直接实现的。这是您实现该属性的方式吗?提前致谢。

private Byte[] _activityId;
public Guid ActivityId 
    {
        get { return new Guid(this._activityId); }
        set
        {
            Byte[] bytes = value.ToByteArray();
            Interlocked.Exchange(ref this._activityId, bytes);
        }
    }

更新:因此,到目前为止唯一提出的解决方案不包括使用任何“线程”类或构造。所以我要提出我已经在评论中提出的问题:

我的理解是引用/原始值类型分配是原子的,但是 Interlocked 将保证更改传播到所有线程。如果我们可以简单地分配值,为什么 Interlocked 公开 API 来交换引用类型和原始值?

最佳答案

您可以通过创建自己的框类来获得更便宜的原子分配:

class Box<T> where T : struct {
    public readonly T Value;
    public Box(T value) { Value = value; }
}

通过存储对(不可变)Box 的引用实例而不是直接存储值,字段上的所有操作都是原子的。

private Box<Guid> _activityId;
public Guid ActivityId {
    get { return this._activityId.Value; }
    set { this._activityId = new Box<Guid>(value); }
}

这样,非原子结构复制操作发生在 new Box<Guid>(value) 中在.Value使用权。因为不涉及领域,所以不会惹事。

这应该比使用字节数组快得多,并且比使用强制转换的原生装箱快一点。 (免责声明:我没有测量)

关于c# - 这是实现线程安全读/写 Guid 属性的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8670304/

相关文章:

java - 数组的读锁

c# - WinDbg .foreach 通过引用类型获取字段值

c# - 图表 c# 的打印预览

c# - Visual Studio正在寻找没有publicKeyToken的旧Nuget包

multithreading - 无需等待即可在线程之间发送消息

c++ - 多个线程能否安全地将相同的值同时写入同一个变量?

c# - 解析数组和单个对象

c# - C#中的循环赛算法

c# - 在异步方法中根据 Id 锁定

c# - 如何测试锁内等待线程