多个线程之间的共享枚举

时间:2017-05-22 23:16:15

标签: c# enumeration volatile atomicity interlocked

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

public enum Action
{
   Read,
   Write,
   None
}

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

public Action _action;

这是一个共享变量,也就是说,它是从多个线程更新和读取的。

例如,我从一个主题开始:

_action = Action.Read

另一个人:

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

所以我想使用Interlock同时从不同的线程更新和/或读取它。我怎么能通过房产呢?

我见过很多帖子,例如下面的一篇:

How to apply InterLocked.Exchange for Enum Types in C#?

这里的问题是枚举需要转换为int,但我想保持枚举而不进行转换。可能吗?如果是这样,你能发布一些例子吗?还有可能将volatile和interlock结合起来吗?我的意思是在易变的枚举上应用互锁。

1 个答案:

答案 0 :(得分:2)

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

您希望使用lock来确保在执行这些语句时不会修改_action

所以你可能有一个锁的对象:

private readonly _lockObject = new object();

然后当_action被设置时:

lock(_lockObject)
{
    _action = newValue;
}

执行条件时,您可以在_action中读取lock的值,然后将其释放。这样,锁可以在最短的时间内保持。如果在您执行条件时修改_action,则不会受到影响,因为您已创建了单独的值,并且您不再依赖_action的值。

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