在Ruby中,線程同步是一個重要的概念,因為它可以防止多個線程同時訪問共享資源,從而導致數據不一致或其他問題。為了正確同步Ruby線程,你可以使用以下方法:
Mutex是Ruby中最常用的同步原語。它確保在同一時間只有一個線程可以訪問共享資源。要使用Mutex,你需要創建一個Mutex對象,然后在需要同步的代碼塊中使用lock
和unlock
方法。
require 'thread'
mutex = Mutex.new
threads = []
10.times do
threads << Thread.new do
mutex.lock
# 訪問共享資源的代碼
puts "Thread #{Thread.current.object_id} is executing"
sleep 1
mutex.unlock
end
end
threads.each(&:join)
Semaphore是一種限制同時訪問共享資源的線程數量的同步原語。要使用Semaphore,你需要創建一個Semaphore對象,并設置允許同時訪問的最大線程數。然后,在需要同步的代碼塊中使用acquire
和release
方法。
require 'thread'
semaphore = Semaphore.new(3) # 允許最多3個線程同時訪問
threads = []
10.times do
threads << Thread.new do
semaphore.acquire
# 訪問共享資源的代碼
puts "Thread #{Thread.current.object_id} is executing"
sleep 1
semaphore.release
end
end
threads.each(&:join)
ThreadGroup允許你管理一組線程。你可以使用join
方法等待組中的所有線程完成。雖然ThreadGroup本身不提供內置的同步機制,但你可以結合其他同步原語(如Mutex)來同步線程組中的線程。
require 'thread'
group = ThreadGroup.new
mutex = Mutex.new
10.times do
group.add_thread(Thread.new do
mutex.lock
# 訪問共享資源的代碼
puts "Thread #{Thread.current.object_id} is executing"
sleep 1
mutex.unlock
end)
end
group.join
總之,為了正確同步Ruby線程,你需要根據具體需求選擇合適的同步原語(如Mutex、Semaphore或ThreadGroup),并在訪問共享資源時使用適當的鎖定和解鎖方法。