【问题标题】:Shared enum between multiple threads多个线程之间共享枚举
【发布时间】:2017-10-22 17:41:24
【问题描述】:

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

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,但我想保留枚举而不进行转换。可能吗?如果是这样,你能发布一些例子吗?另外是否可以将易失性与联锁结合起来?我的意思是对易失性枚举应用互锁。

【问题讨论】:

  • 这个问题和链接的问题问的是同一件事:“我知道如何通过强制转换来解决这个问题。我可以不用强制转换来解决它吗?”我不认为说“不,真的,我不想使用强制转换”会使这些答案无效或使其不重复。您可能会尝试调整接近如果不是完全重复的问题Interlocked.CompareExchange with enum 的一些答案,但我认为您会发现这些解决方案并不比铸造更漂亮/更干净/更理想。真的。

标签: c# enumeration volatile atomic interlocked


【解决方案1】:

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

您需要使用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
{
}

【讨论】:

  • 将变量 _action 与锁结合起来是个好主意吗?例如 public volatile Action _action
猜你喜欢
  • 2014-05-21
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 2023-02-20
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多