c# - 锁对象数组可用于保证对 MyClassArray 的线程安全访问?
问题描述
我有一个 MyClassArray[fixed lentgh N] 我想保证每个元素的线程安全访问。当我需要使用一个元素时,我不想锁定整个数组。我想知道是否有相同大小的 lockArray 的锁定对象,每当我想从 MyClassArray 访问元素 i 时,我都会执行 Monitor.Enter(lockArray[i]),对 MyClassArray[i] 的访问将是线程安全的。我担心的是并发访问 lockArray[i] 是否会搞砸。对不起,如果这太天真了,或者这个问题有另一个简单的解决方案。我是多线程和 C# 的新手。
Rgds,克里斯蒂亚诺
解决方案
假设您有两个相同大小的数组values
和locks
:
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;
}
...这是完全线程安全的,前提是:
数组的初始化
locks
将在启动将执行处理的线程或任务之前发生。否则,您可能会遇到可见性问题(可以通过 theThread.MemoryBarrier
和其他方式解决,但最好避免这种复杂性)。数组的每个元素
values
都可以独立于其他元素进行变异。否则,如果您发现需要像这样创建嵌套锁:
lock (locks[13])
lock (locks[14])
values[13] += values[14];
...那么您可能遇到了麻烦(您可能必须解决五个用餐哲学家问题以防止死锁)。
推荐阅读
- google-apps-script - onFormSubmit 触发器发送最后一行提交以同时提交
- android - 改造响应无法处理空间
- r - 计算R中单词的出现次数,总单词和总唯一单词
- c++ - 我可以从 divide_typeof_helper 中检索基本单位吗?
- maven - Maven 删除文件阶段验证除了选定的文件
- ios - 需要从 open api 获取国家名称
- excel - 循环过滤列表并突出显示总可见行的 20%
- office365 - 将所选电子邮件作为附件附加到草稿电子邮件
- geometry - 在两个屏幕之间变换点
- hyperledger-fabric - 如何在本地机器上运行 Hyperledger Fabric 网络?