在没有同步的情况下修改可为空的DateTimeOffset字段是否安全

时间:2018-03-21 12:33:51

标签: c# multithreading thread-safety

提供以下课程:

public class LockfreeThing
{
    public DateTimeOffset? When { get; private set; }

    public void Work(DateTimeOffset? someOffset)
    {
        var copy = When;
        if (copy.HasValue)
        {
            if (copy > someOffset)
            {
                // Use copy safely
            }
            else
            {
                When = null;
            }
        }

        When = someOffset;
    }
}

根据此SO answer,由于When支持字段为struct,此处的引用分配不是线程安全的。

忽略var copy = When可能读取CPU缓存并缺少最新值的可能性,是否可以使这些代码无锁且线程安全?

1 个答案:

答案 0 :(得分:0)

对DateTime的赋值绝不是线程安全的(如果它是null)。

你可以使用Ticks代替DateTime和Int64,并使用Interlocked方法来访问它。

然而,使用锁有什么问题?