锁定和操作需要很长时间

时间:2013-11-22 03:18:02

标签: c++ c multithreading locking

我认为这是一个常见的问题。例如,我有一个由一个进程/线程修改的数组:

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();

有没有更好的方法来打印整个阵列?

2 个答案:

答案 0 :(得分:3)

如果是需要很长时间的打印部件,你可以拿锁,拿一个数组副本,释放锁并打印数组副本。

答案 1 :(得分: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();   
}

但是,如果数组的语义不是彼此独立,而是整个数组需要原子一致性,那么你就会陷入原始的全局锁定。

但是你仍然可以在锁定下获取数组的副本,然后打印副本,因为这样可以使数组的锁定时间更短,而不必等待打印。