2011-09-19 48 views
2

假设我有一个多线程应用程序读取和写入的项目集合。当涉及到在一些项目上应用算法时,我会用不同的方法获取锁。通常锁定集合的最佳方法是什么?

通过在整个操作过程中锁定:

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++,但我非常确定它是无关紧要的。

回答

2

看看Double Check lock模式,其中涉及锁定下的收集/字段的单独字段。

也值得去看一看的Readers-writer lock技术,它允许读取,而另一线程更新的集合

编辑: 当大卫赫弗南提到看一看的​​讨论

+0

无论这种技术,你会怎么做我的情况? –

+0

查看更新后的答案,想法是将单独的字段/变量与集合一起引入,并锁定该集合或每个元素的锁定的特定字段(前者是一团糟!) – sll

+0

不建议在没有讨论“双重检查锁定已损坏”声明。 –

0

锁定获取和释放是昂贵的。我会锁定集合而不是循环中的每个单独元素。如果整个操作需要原子化,这是有道理的。

2

在一个多线程设置,带有线程读写功能,你的第一个和第二个例子有不同的含义。如果“用项目做某事”与其他线程交互,你的第三个例子可能会有另一个含义。

在决定如何去做之前,你需要决定你想要的代码。

+0

“与物品做某事”将与其他线索进行交互,但不会与使用我收藏物品的线程进行交互。 –

相关问题