锁对象数组可用于保证对 MyClassArray 的线程安全访问?
Array of lock objects can be used to guarantee thread safe access to MyClassArray?
我有一个 MyClass 的 MyClassArray[固定长度 N],我想保证对每个元素的线程安全访问。我不想在需要处理一个元素时锁定整个数组。我想知道是否有相同大小的锁定对象的 lockArray,每当我想从 MyClassArray 访问元素 i 时,我都会执行 Monitor.Enter(lockArray[i]) 对 MyClassArray[i] 的访问将是线程安全的。我担心的是并发访问 lockArray[i] 是否会把事情搞砸。
抱歉,如果这太天真了,或者是否有其他简单的解决方案可以解决此问题。我是多线程和 C# 的新手。
Rgds,
克里斯蒂亚诺
假设您有两个 same-sized 数组 values
和 locks
:
int[] values = Enumerable.Range(0, 100).ToArray();
object[] locks = Enumerable.Range(0, 100).Select(_ => new object()).ToArray();
...并且您想用 locks
的相应元素保护 values
的每个元素:
lock (locks[13])
{
values[13] += 1;
}
...这是完美的 thread-safe,前提是:
初始化
locks
数组将在启动将执行处理的线程或任务之前发生。否则你可能会遇到可见性问题(可以通过 Thread.MemoryBarrier
和其他方式解决,但你最好避免这种复杂性)。
values
数组的每个元素都可以独立于其他元素进行变异。否则,如果您发现需要像这样创建嵌套锁:
lock (locks[13])
lock (locks[14])
values[13] += values[14];
...那么你可能有麻烦了(为了防止死锁,你可能必须解决Five Dining philosophers问题)。
我有一个 MyClass 的 MyClassArray[固定长度 N],我想保证对每个元素的线程安全访问。我不想在需要处理一个元素时锁定整个数组。我想知道是否有相同大小的锁定对象的 lockArray,每当我想从 MyClassArray 访问元素 i 时,我都会执行 Monitor.Enter(lockArray[i]) 对 MyClassArray[i] 的访问将是线程安全的。我担心的是并发访问 lockArray[i] 是否会把事情搞砸。 抱歉,如果这太天真了,或者是否有其他简单的解决方案可以解决此问题。我是多线程和 C# 的新手。
Rgds, 克里斯蒂亚诺
假设您有两个 same-sized 数组 values
和 locks
:
int[] values = Enumerable.Range(0, 100).ToArray();
object[] locks = Enumerable.Range(0, 100).Select(_ => new object()).ToArray();
...并且您想用 locks
的相应元素保护 values
的每个元素:
lock (locks[13])
{
values[13] += 1;
}
...这是完美的 thread-safe,前提是:
初始化
locks
数组将在启动将执行处理的线程或任务之前发生。否则你可能会遇到可见性问题(可以通过Thread.MemoryBarrier
和其他方式解决,但你最好避免这种复杂性)。values
数组的每个元素都可以独立于其他元素进行变异。否则,如果您发现需要像这样创建嵌套锁:
lock (locks[13])
lock (locks[14])
values[13] += values[14];
...那么你可能有麻烦了(为了防止死锁,你可能必须解决Five Dining philosophers问题)。