推荐答案
// www.javascriptcn.com code example
require 'thread'
mutex = Mutex.new
resource = ConditionVariable.new
flag = false
# 线程1:等待条件
Thread.new do
mutex.synchronize do
while !flag
puts "线程1: 等待条件满足"
resource.wait(mutex)
end
puts "线程1: 条件已满足,继续执行"
end
end
# 线程2:设置条件并通知
Thread.new do
sleep(2) # 模拟耗时操作
mutex.synchronize do
flag = true
puts "线程2: 条件已设置,通知等待的线程"
resource.signal
end
end
# 主线程等待子线程完成
sleep(3)本题详细解读
ConditionVariable 的作用
ConditionVariable 是 Ruby 中用于线程同步的机制之一。它通常与 Mutex 配合使用,用于在多个线程之间进行条件等待和通知。ConditionVariable 允许一个线程在某个条件不满足时进入等待状态,直到另一个线程修改了条件并通知它继续执行。
关键方法
wait(mutex):释放mutex并进入等待状态,直到被signal或broadcast唤醒。唤醒后,线程会重新获取mutex并继续执行。signal:唤醒一个正在等待的线程。broadcast:唤醒所有正在等待的线程。
代码解析
线程1:在
mutex的保护下,检查flag是否为true。如果flag为false,则调用resource.wait(mutex)进入等待状态。当flag被设置为true并被通知后,线程1会继续执行。线程2:在
mutex的保护下,将flag设置为true,并调用resource.signal通知等待的线程1继续执行。主线程:通过
sleep(3)确保子线程有足够的时间完成操作。
使用场景
ConditionVariable 常用于生产者-消费者模型、线程池等场景,其中线程需要等待某些条件满足后才能继续执行。