我填写了几个列表<>使用默认值,将它们粘贴到结构中,然后将结构传递给多个线程。每个线程都有不同的范围,因此线程1将访问列表[0到199]线程2将访问[200 - 400]等。我需要一个锁吗?我什么时候需要它?我可以使用我的多个线程使用锁访问列表。但是如果我的主线程要读取列表中的数据(从不写),我需要锁定吗?我确定我不会,但我想在实施前询问。
-edit -
谢谢你们,你们回答了我的问题。 (只要有人不反驳当前的答案,我会接受一个)
答案 0 :(得分:8)
如果您没有修改集合,则根本不需要锁定。
如果您想使用其中一个主题修改集合,可能需要查看ReaderWriterLock。
彼得的评论是一个值得注意的评论。正如上面的MSDN链接所指出的,如果您使用的是.NET 3.5,则应考虑使用ReaderWriterLockSlim类。不过,这个想法是一样的。答案 1 :(得分:2)
如果您完全确定不修改实际列表(添加项目,删除项目等),则不需要锁定。
答案 2 :(得分:2)
如果你不写,你不需要锁。但是如果你在其他线程中写,那么你应该有一个锁。即使这些线程只访问特定范围,如果向列表中添加可能导致问题的节点。如果你没有改变列表结构但只改变节点中的任何内容,那么我认为没有问题。
答案 3 :(得分:1)
在你的struct对象中,我至少会将变量标记为ReadOnly,也许是新的ReadOnlyCollection
public struct MyStruct
{
private readonly ReadOnlyCollection<int> _myInts;
public MyStruct(ReadOnlyCollection<int> ints)
{
_myInts = ints;
}
}
答案 4 :(得分:0)
您是否考虑过使用数组?只要您不在两个线程中访问相同的索引,数组就是线程安全的。此外,如果不改变尺寸,它会更快。