推荐答案
在 Ruby 中,线程同步可以通过以下几种方式实现:
- Mutex(互斥锁):使用
Mutex类来确保同一时间只有一个线程可以访问共享资源。 - ConditionVariable(条件变量):与
Mutex结合使用,用于线程间的通信和同步。 - Queue(队列):使用线程安全的队列来实现线程间的数据传递和同步。
使用 Mutex 进行线程同步
// www.javascriptcn.com code example
mutex = Mutex.new
shared_resource = 0
threads = []
10.times do
threads << Thread.new do
mutex.synchronize do
shared_resource += 1
end
end
end
threads.each(&:join)
puts shared_resource使用 ConditionVariable 进行线程同步
// www.javascriptcn.com code example
mutex = Mutex.new
condition = ConditionVariable.new
resource_available = false
producer = Thread.new do
mutex.synchronize do
# 模拟资源生产
sleep(1)
resource_available = true
condition.signal
end
end
consumer = Thread.new do
mutex.synchronize do
while !resource_available
condition.wait(mutex)
end
puts "Resource is available"
end
end
[producer, consumer].each(&:join)使用 Queue 进行线程同步
// www.javascriptcn.com code example
queue = Queue.new
producer = Thread.new do
10.times do |i|
sleep(1)
queue << i
end
end
consumer = Thread.new do
10.times do
value = queue.pop
puts "Consumed: #{value}"
end
end
[producer, consumer].each(&:join)本题详细解读
Mutex(互斥锁)
Mutex 是 Ruby 中最基本的线程同步工具。它通过 synchronize 方法确保同一时间只有一个线程可以执行代码块中的内容。当一个线程进入 synchronize 块时,其他线程必须等待,直到该线程退出块。
ConditionVariable(条件变量)
ConditionVariable 通常与 Mutex 一起使用,用于线程间的通信。它允许线程在某个条件不满足时进入等待状态,并在条件满足时被唤醒。ConditionVariable 的 wait 方法会释放 Mutex,并在条件满足时重新获取 Mutex。
Queue(队列)
Queue 是线程安全的队列,适用于生产者-消费者模式。生产者线程将数据放入队列,消费者线程从队列中取出数据。Queue 自动处理线程间的同步,确保数据的安全传递。
通过以上三种方式,可以在 Ruby 中有效地实现线程同步,避免多线程环境下的资源竞争和数据不一致问题。