并行编程模型与性能分析
1. 死锁问题
在并行编程中,非确定性行为和竞态条件可以通过锁同步等同步机制来避免。然而,锁的使用可能会导致死锁。当程序执行进入一种状态,每个线程都在等待另一个线程才能引发的事件,而这个线程也在等待时,就会发生死锁。
一般来说,对于一组活动,如果每个活动都在等待其他活动之一才能引发的事件,从而形成一个相互等待的循环,就会发生死锁。以下是一个两个线程 T1 和 T2 都使用两个锁 s1 和 s2 的示例:
Thread T1
lock(s1);
lock(s2);
do work();
unlock(s2)
unlock(s1)
Thread T2
lock(s2);
lock(s1);
do work();
unlock(s1)
unlock(s2)
当执行顺序如下时会发生死锁:
- 线程 T1 先尝试设置锁 s1,然后是 s2;在成功锁定 s1 后,T1 被调度器中断。
- 线程 T2 先尝试设置锁 s2,然后是 s1;在成功锁定 s2 后,T2 等待 s1 的释放。
在这种情况下,s1 被 T1 锁定,s2 被 T2 锁定。两个线程 T1 和 T2 都在等待对方线程释放缺失的锁,但这无法发生,因为另一个线程也在等待。
避免这种相互或循环等待的情况非常重要,因为在这种情况下程序无法终止。在某些线程必须设置多个锁才能继续执行的情况下,有特定的技术可以避免死锁。
2. 内存访问时间和缓存效应
内存访问时间可能占并行程序执行时间的很大一部分。程序发出的
超级会员免费看
订阅专栏 解锁全文
10万+

被折叠的 条评论
为什么被折叠?



