gpt4 book ai didi

c# - 围绕写入的锁定是否保证在另一个线程中进行新鲜读取? (.Net,内存模型)

转载 作者:行者123 更新时间:2023-11-30 15:45:26 25 4
gpt4 key购买 nike

假设我有一个属性,其 setter 受锁保护,但 getter 周围没有任何锁,例如

private long _myField;
public long MyProperty
{
get { return _myField; }
set { lock(whatever) _myField = value; }
}

除了同步写入(但不是读取)之外,锁,或者更确切地说,Monitor.Exit,应该会导致 volatile write .现在假设我们有两个线程 A 和 B,并且会发生以下顺序:

  1. A 读取 MyProperty 的当前值。
  2. B 向 MyProperty 写入一个新值。
  3. A 再次读取 MyProperty 的当前值。

问:A现在能保证看到新的值吗?或者我们的锁只是确保 B 及时写入主内存,而不是其他线程读取新值?或者答案甚至取决于我们是在 .Net 2+ 中运行还是在“较弱”的 ECMA 实现中运行?

最佳答案

不,因为读取没有明确的内存屏障,所以不能“保证”看到新值。

您可以使用 ReaderWriterLockSlim以确保 a) 写入相互锁定以及 b) 读取始终获取新值。

private readonly ReaderWriterLockSlim _myFieldLock = new ReaderWriterLockSlim();
private long _myField;
public long MyProperty
{
get
{
_myFieldLock.EnterReadLock();
try
{
return _myField;
}
finally
{
_myFieldLock.ExitReadLock();
}
}
set
{
_myFieldLock.EnterWriteLock();
try
{
_myField = value;
}
finally
{
_myFieldLock.ExitWriteLock();
}
}
}

关于c# - 围绕写入的锁定是否保证在另一个线程中进行新鲜读取? (.Net,内存模型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5208926/

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