多个线程之间的共享枚举

Shared enum between multiple threads

我有一个在多个线程之间共享的枚举:

public enum Action
{
   Read,
   Write,
   None
}

在 class 中,我有一个 Action 类型的变量:

public Action _action;

这是一个共享变量,即从多个线程更新和读取。

例如,从一个线程我做:

_action = Action.Read

还有另一个:

if (_action == Action.Read)
{
}
else if (_action == Action.Write)
{
}
else if (_Action == Action.None)
{
}
else
{
}

所以我想使用 Interlock 来更新 and/or 同时从不同的线程读取它。我怎样才能通过 属性?

我看过很多post,比如下面一个:

如何在 C# 中为枚举类型应用 InterLocked.Exchange?

这里的问题是枚举需要转换为 int,但我想保留枚举而不进行转换。可能吗?如果是这样,你能 post 举个例子吗?也可以将 volatile 与 interlock 结合使用吗?我的意思是在可变枚举上应用互锁。

在这种情况下 Interlocked 没有用。您的一系列 if/then 检查取决于 _action 的值在它们全部执行时保持不变。否则 _action==Action.Read 可能为假,但在下一条语句执行之前 _action 设置为 Action.Read 并且所有其他条件都为假。

您希望使用 lock 来确保在执行这些语句时没有任何内容修改 _action

所以您可能有一个锁对象:

private readonly _lockObject = new object();

然后当设置 _action 时:

lock(_lockObject)
{
    _action = newValue;
}

并且在执行条件时,您可以只读取 lock_action 的值,然后释放它。这样,锁定的时间就会尽可能短。如果 _action 在您执行条件时被修改,您将不会受到影响,因为您已经创建了一个单独的值并且您不再依赖于 _action.[=25= 的值]

Action action;
lock(_lockObject)
{
    action = _action
}
if (action == Action.Read)
{
}
else if (action == Action.Write)
{
}
else if (action == Action.None)
{
}
else
{
}