Ruby 多线程与环境配置全解析
1. 多线程编程中的死锁问题
在使用 Mutex 对象进行线程互斥时,必须小心避免死锁。死锁是指所有线程都在等待获取其他线程持有的资源,由于所有线程都被阻塞,它们无法释放自己持有的锁,进而导致其他线程也无法获取这些锁。
一个经典的死锁场景涉及两个线程和两个 Mutex 对象。线程 1 锁定 Mutex 1 后尝试锁定 Mutex 2,而线程 2 锁定 Mutex 2 后尝试锁定 Mutex 1,这样两个线程都无法获取所需的锁,且都不能释放对方需要的锁,从而导致两个线程永远被阻塞。以下是示例代码:
require 'thread'
m,n = Mutex.new, Mutex.new
t = Thread.new {
m.lock
puts "Thread t locked Mutex m"
sleep 1
puts "Thread t waiting to lock Mutex n"
n.lock
}
s = Thread.new {
n.lock
puts "Thread s locked Mutex n"
sleep 1
puts "Thread s waiting to lock Mutex m"
m.lock
}
t.join
s.join
为避免此类死锁,应始终按相同顺序锁定资源。若第二个线程先锁定 m 再锁定 n,就不会发生死锁。
需要注意的是,即使不使用 Mutex 对象也可能出现死锁。例如,在一个调用 Thread.stop 的线程上调用
超级会员免费看
订阅专栏 解锁全文
577

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



