以下算法是否无锁?

时间:2017-07-08 13:00:34

标签: parallel-processing lock-free locks

根据我的理解,如果某个线程总是取得进展,则算法是无锁的。

以下示例(使用锁定)现在不满足此条件:

线程1:将lock1用于关键部分
线程2:将lock1用于关键部分
线程3:一些调用独立于lock1而另外两个线程一般

1 个答案:

答案 0 :(得分:0)

你所描述的肯定不是无锁定的#34;在任何有意义的意义上线程1和2依赖于相同的共享资源(一个关键部分,由" lock1"强制执行),因此如果其中一个获取该锁然后被挂起,那么另一个线程将在其上等待死锁

当然,线程3将继续保持不变,但线程A,B和C(即。,与您的程序无关的线程)也是如此。这看起来与整个算法无关,这可能是由三个线程组成的。

基本上,你定义"无锁"的问题这是不够精确的。你说算法是无锁的"如果某个线程总是取得进展",但你没有看到整个算法。

线程3非常无锁(因为它在没有任何其他线程的帮助下自行进行),但是你的整体算法不是。

评估算法是否无锁的更好方法是问自己:如果单个线程被挂起,这会阻止其他线程作为一个进行吗?在这种情况下,是的。如果线程1或线程2获得锁定然后被挂起,这将阻止其他线程执行,并且可能这些其他线程正在执行对您的算法很重要的工作。

我建议Jeff Preshing's blog post, "An Introduction to Lock-Free Programming"。这是一篇方便的博客文章流程图:

Are you programming with multiple threads? -> Yes -> Do the threads access shared memory? -> Yes -> Can the threads block each other? -> No -> It's lock-free programming!