锁定集合的常用最佳方法是什么?

时间:2011-09-19 09:56:35

标签: multithreading concurrency thread-safety

假设我有一组在多线程应用程序中读写的项目。当谈到将算法应用于某些项目时,我会以不同的方式获取锁定。

在整个操作过程中锁定:

lock(collection)
{
    for each thing in things
    {
        get the item from collection that matches thing
        do stuff with item
    }
}

按需锁定:

for each thing in things
{
    lock(collection)
    {
        get the item from collection that matches thing
    }
    do stuff with item
}

或者按需锁定以获取稍后要处理的项目的线程安全集合,从而将集合锁定的时间较短:

Items items
for each thing in things
{
    lock(collection)
    {
        get the item from collection that matches thing
    }
    items.Add(item)
}
for each item in items
{
    do stuff with item
}

我知道它最终可能取决于应用于每个项目的实际算法,但你会怎么做?我正在使用C ++,但我很确定这是无关紧要的。

3 个答案:

答案 0 :(得分:2)

查看Double Check lock模式,该模式涉及锁定下的集合/字段的单独字段。

另外值得一看的是Readers-writer lock技术,允许在其他线程更新集合时进行阅读

修改 正如David Heffernan所提​​到的那样,看看The "Double-Checked Locking is Broken" Declaration讨论

答案 1 :(得分:2)

在多线程设置中,通过线程读写,您的第一个和第二个示例具有不同的含义。如果“使用item执行某些操作”与其他线程交互,则您的第三个示例可能具有另一种含义。

在决定如何执行此操作之前,您需要确定代码要执行的操作。

答案 2 :(得分:0)

锁定获取和释放非常昂贵。我会锁定集合而不是循环中的每个单独元素。如果整个操作需要是原子的,那就没有意义。