【发布时间】:2018-03-21 12:33:51
【问题描述】:
给出以下课程:
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 缓存并丢失最新值的可能性,是否有可能使此类代码无锁和线程安全?
【问题讨论】:
-
“是否有可能使这样的代码无锁和线程安全?”它的哪一部分?整个
Work方法?还是自己做作业? -
能够读取/写入何时(可为空的 DateTimeOffset)
-
我不认为你可以。只需使用 lock 并完成它。
-
它是一个结构,不仅仅是因为它是DateTimeOffset,还因为它可以为空。结构的更新永远不是原子的。或者换句话说,处理器必须使用多次写入来更新值。这绝不是线程安全的,另一个线程可能会在仅部分更新时观察该值。产生“撕裂的阅读”。非常讨厌的错误进行故障排除,它几乎不会经常出错。您无法调试每月仅出现一次的错误。
-
真的这么长吗?并且不可能使用 Ticks。好的,所以这根本不可能。谢谢。
标签: c# multithreading thread-safety