我有一个在多个线程之间共享的枚举:
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结合起来吗?我的意思是在易变的枚举上应用互锁。
答案 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
{
}