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)