【发布时间】:2018-11-29 09:58:47
【问题描述】:
我有long? startTime 来保持开始时间。
我有多个线程使用非async 方法更新startTime,并且在一个单独的线程中还有另一个async 方法只读取这个值。更新值的方法如下:
if (startTime == null || (newValue != 0 && newValue < startTime))
{
startTime = newValue;
}
问题在于,写入线程正在以非常高的频率更新startTime,从而导致大量的锁争用。那么,有什么方法可以在不加锁的情况下做到这一点(或者比普通锁更好的锁定机制)?
我正在考虑使用Interlocked,但由于if 子句,我认为这不正确?
编辑:如果需要,我可以将其更改为不可为空。
【问题讨论】:
-
你不能使用
Interlocked,因为它不支持Nullable<long>。 -
你可以使用 int64 而不是 long。
-
@GabrielPereira,
Int64是long。 -
互锁操作支持的最大大小是 64 位(至少在 .NET 中公开)。
Nullable<T>至少是sizeof(bool) + sizeof(T),所以对于long,你肯定会超过。 -
我在您发布的代码中看不到任何锁定。
标签: c# multithreading locking interlocked