【问题标题】:locking and operation taking long time锁定和操作需要很长时间
【发布时间】:2013-11-22 03:18:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ c multithreading locking


    【解决方案1】:

    如果是打印部分耗时较长,可以取锁,取数组副本,释放锁,打印数组副本。

    【讨论】:

    • 这对于快速复制类型的小型数组当然是可行的,但如果这在运行时间上与打印相似......
    【解决方案2】:

    你使用什么样的锁,互斥锁?另外,当(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();   
    }
    

    但是,如果您的数组的语义是这样的,即单元格不相互独立,但您需要整个数组的原子一致性,那么您将被原来的全局锁卡住。

    但是,您仍然可以获取处于锁定状态的数组副本,然后打印副本,因为这样可以在更短的时间内保持数组的锁定,而无需等待打印。

    【讨论】:

    • 如果数组元素之间的一致性不重要,甚至可以使用std::atomic数组类型。
    猜你喜欢
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2020-08-26
    • 2014-10-09
    • 2012-11-26
    相关资源
    最近更新 更多