很多复杂的多线程代码

时间:2012-08-21 13:50:19

标签: concurrency time-complexity

如何指定受多线程影响的算法的运行时间?

例如,可能永远不会满足CompareAndSet循环(如果你非常不走运)

AtomicReference<ContainerOfItems> oldContainer;

void AddItem(Item aItem)
{
    ContainerOfItems newContainer;

    do
    {
        newContainer = null;
        newContainer = new ContainerOfItems();
        newContainer.CopyContents(oldContainer);
        newContainer.Add(aItem);
    }
    while (!CompareAndSet(oldContainer, newContainer));

    oldContainer = null;
}

在这个例子中(看起来很像Java,但实际上是伪代码)CopyContents 操作可能需要很长时间,因此oldContainer已被其他线程替换,导致CompareAndSet失败。这段代码的运行时间是多少?

1 个答案:

答案 0 :(得分:1)

  

此代码的运行时间是什么时候?

程序的整体运行时间在很大程度上取决于copyContents(...)需要多长时间以及预测会导致compareAndSet(...)失败的竞争条件的频率。这将取决于同时运行的线程数。

但是,我怀疑就Big-O而言,因compareAndSet(...)而循环的次数并不重要。例如,如果copyContents(...)需要花费O(N)时间,则平均需要循环3次才能完成compareAndSet(...),并且运行N次以添加所有项目,它是O(N ^ 2) - 因为常数而退出3。

另外,因为你意味着并发,所以也会有一个因素速度的提高,因为算法将是多线程的,但这也只是一个恒定的因素改进而不会影响Big-O。因此可以通过查看copyContents(...)次(我假设)N的Big-O来计算Big-O。