【发布时间】:2021-08-29 08:20:48
【问题描述】:
我被分配了一个任务来编写一个具有以下合同的最大计数器类:
class MaxCounter
{
private int _value = int.MinValue;
public void Max(int value)
{
if(value > _value)
{
_value = value;
}
}
public int Value => _value;
}
作业要求使用Interlocked 类实现线程安全、非锁定的解决方案。我想到了这个实现:
public void Update(int value)
{
if (value > Interlocked.Read(ref _value))
{
Interlocked.Exchange(ref _value, value);
Console.WriteLine("Thread {0} updated counter to {1}.", Thread.CurrentThread.ManagedThreadId, value);
}
}
但我相信可以通过CompareExchange 函数对其进行改进。你怎么看?
【问题讨论】:
-
只是挑剔:我认为最好匹配两个 sn-ps 中的方法名称(您的第二个 sn-p 包含
Update方法而不是Max) -
不仅仅是“改进”。您的解决方案不是线程安全的,因为在 Read 和 Exchange 之间另一个线程可以访问和更新对象。
标签: c# thread-safety interlocked