2013-11-22 69 views
0

我认为这是一个常见问题。例如,我具有由一个进程/线程改性的数组:锁定和操作需要很长时间

lock(); 
for(int i; i<array_size; i++) { 
    // find an item and do some operations 
} 
unlock(); 

还有另一个进程/线程,这将偶尔打印整个阵列,但它可能需要一个“长”时间:

lock() 
for(int i; i<array_size; i++) { 
    print(array[i]); 
} 
unlock(); 

有没有更好的方法来打印整个数组?

回答

3

如果打印部分花费很长时间,则可以取锁,获取阵列的副本,释放锁并打印阵列副本。

+0

对于快速拷贝类型的小阵列来说,这当然是可行的,但是如果在打印的运行时间类似的话...... – arne

1

你使用什么样的锁,互斥锁? (1)更新它们时,以及(2)何时打印它们,您希望数组中的单个单元格具有何种一致性?如果每个数组单元都是独立的,那么为什么不只有更多的锁只负责这些单元呢?

赞;

mutex locks[array_size]; 
for (int i=0; i< mutex_size; i++) { 
    locks[i].lock(); 
    // do something or print content... 
    locks[i].unlock(); 
} 

但是,如果你的阵列的语义是这样的细胞不是相互独立的,但你跨阵列需要原子一致性,那么你就坚持你原来的全局锁。

但是,您仍然可以获取锁定下的阵列副本,然后打印副本,因为这样可以在较短的时间内保持阵列的锁定而不必等待打印。

+0

如果数组元素之间的一致性不重要,甚至可以使用std :: atomic '数组类型。 – arne