首页 > 解决方案 > 锁对象数组可用于保证对 MyClassArray 的线程安全访问?

问题描述

我有一个 MyClassArray[fixed lentgh N] 我想保证每个元素的线程安全访问。当我需要使用一个元素时,我不想锁定整个数组。我想知道是否有相同大小的 lockArray 的锁定对象,每当我想从 MyClassArray 访问元素 i 时,我都会执行 Monitor.Enter(lockArray[i]),对 MyClassArray[i] 的访问将是线程安全的。我担心的是并发访问 lockArray[i] 是否会搞砸。对不起,如果这太天真了,或者这个问题有另一个简单的解决方案。我是多线程和 C# 的新手。

Rgds,克里斯蒂亚诺

标签: c#multithreadinglocking

解决方案


假设您有两个相同大小的数组valueslocks

int[] values = Enumerable.Range(0, 100).ToArray();
object[] locks = Enumerable.Range(0, 100).Select(_ => new object()).ToArray();

...并且您想values用 的相应元素保护 的每个元素locks

lock (locks[13])
{
    values[13] += 1;
}

...这是完全线程安全的,前提是:

  1. 数组的初始化locks将在启动将执行处理的线程或任务之前发生。否则,您可能会遇到可见性问题(可以通过 theThread.MemoryBarrier和其他方式解决,但最好避免这种复杂性)。

  2. 数组的每个元素values都可以独立于其他元素进行变异。否则,如果您发现需要像这样创建嵌套锁:

    lock (locks[13])
        lock (locks[14])
            values[13] += values[14];

...那么您可能遇到了麻烦(您可能必须解决五个用餐哲学家问题以防止死锁)。


推荐阅读