假设我有一组在多线程应用程序中读写的项目。当谈到将算法应用于某些项目时,我会以不同的方式获取锁定。
在整个操作过程中锁定:
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 ++,但我很确定这是无关紧要的。
答案 0 :(得分:2)
查看Double Check lock模式,该模式涉及锁定下的集合/字段的单独字段。
另外值得一看的是Readers-writer lock技术,允许在其他线程更新集合时进行阅读
修改强> 正如David Heffernan所提到的那样,看看The "Double-Checked Locking is Broken" Declaration讨论
答案 1 :(得分:2)
在多线程设置中,通过线程读写,您的第一个和第二个示例具有不同的含义。如果“使用item执行某些操作”与其他线程交互,则您的第三个示例可能具有另一种含义。
在决定如何执行此操作之前,您需要确定代码要执行的操作。
答案 2 :(得分:0)
锁定获取和释放非常昂贵。我会锁定集合而不是循环中的每个单独元素。如果整个操作需要是原子的,那就没有意义。