如何指定受多线程影响的算法的运行时间?
例如,可能永远不会满足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
失败。这段代码的运行时间是多少?
答案 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。