C# 多线程之间的共享枚举

C# 多线程之间的共享枚举,c#,enumeration,volatile,atomicity,interlocked,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.W

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

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
{
}
所以我想使用联锁来更新和/或同时从不同线程读取它。我怎样才能通过一个物业来做呢

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


这里的问题是枚举需要强制转换为int,但我希望保留枚举而不强制转换。可能吗?如果是这样,你能举一些例子吗?也可以将挥发性物质与联锁装置结合起来吗?我的意思是对易失性枚举应用互锁。

在这种情况下,
互锁将不会有用。您的一系列
if/then
检查取决于
\u action
的值在执行时保持不变。否则,
\u action==action.Read
可能为false,但在下一条语句执行之前,
\u action
设置为
action.Read
,所有其他条件都为false

您需要使用
lock
来确保在执行这些语句时没有任何内容修改
\u action

因此,您的锁可能有一个对象:

private readonly _lockObject = new object();
然后,当_action被设置时:

lock(_lockObject)
{
    _action = newValue;
}
执行条件时,您可以读取
锁中
操作的值,然后释放它。这样,锁的保持时间尽可能短。如果在执行条件时修改了
\u action
,则不会影响您,因为您已经创建了一个单独的值,并且不再依赖
\u action
的值

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

在这种情况下,
互锁
将不会有用。您的一系列
if/then
检查取决于
\u action
的值在执行时保持不变。否则,
\u action==action.Read
可能为false,但在下一条语句执行之前,
\u action
设置为
action.Read
,所有其他条件都为false

您需要使用
lock
来确保在执行这些语句时没有任何内容修改
\u action

因此,您的锁可能有一个对象:

private readonly _lockObject = new object();
然后,当_action被设置时:

lock(_lockObject)
{
    _action = newValue;
}
执行条件时,您可以读取
锁中
操作的值,然后释放它。这样,锁的保持时间尽可能短。如果在执行条件时修改了
\u action
,则不会影响您,因为您已经创建了一个单独的值,并且不再依赖
\u action
的值

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

这个问题和相关的问题都在问同样的问题:“我知道如何通过施法来解决这个问题。我可以不用施法来解决它吗?”我不认为说“不,真的,我不想使用施法”会使这些答案无效,或者说这不是一个重复。你可以尝试将一些答案改编成一个近乎重复的问题,但我认为你会发现这些解决方案并不比铸造更漂亮/更干净/更可取。真的。这和相关的问题问的是同一件事:“我知道如何用施法解决这个问题。我能不用施法解决它吗?”我不认为说“不,真的,我不想用施法”会使这些答案无效,或者使其不再重复。你可以尝试将一些答案改编成一个近乎重复的问题,但我认为你会发现这些解决方案并不比铸造更漂亮/更干净/更可取。真的。把变量_动作和锁结合起来也是个好主意?例如,public volatile Action\u Action,将variable\u Action与lock结合使用也是一个好主意?例如公共易失性行动(public volatile Action)