我需要锁定列表吗? C#

时间:2009-04-25 10:41:21

标签: c# multithreading locking

我填写了几个列表<>使用默认值,将它们粘贴到结构中,然后将结构传递给多个线程。每个线程都有不同的范围,因此线程1将访问列表[0到199]线程2将访问[200 - 400]等。我需要一个锁吗?我什么时候需要它?我可以使用我的多个线程使用锁访问列表。但是如果我的主线程要读取列表中的数据(从不写),我需要锁定吗?我确定我不会,但我想在实施前询问。

-edit -

谢谢你们,你们回答了我的问题。 (只要有人不反驳当前的答案,我会接受一个)

5 个答案:

答案 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)

您是否考虑过使用数组?只要您不在两个线程中访问相同的索引,数组就是线程安全的。此外,如果不改变尺寸,它会更快。