Ruby線程如何正確同步

小樊
82
2024-11-03 05:22:44

在Ruby中,線程同步是一個(gè)重要的概念,因?yàn)樗梢苑乐苟鄠€(gè)線程同時(shí)訪問(wèn)共享資源,從而導(dǎo)致數(shù)據(jù)不一致或其他問(wèn)題。為了正確同步Ruby線程,你可以使用以下方法:

  1. 使用Mutex(互斥鎖):

Mutex是Ruby中最常用的同步原語(yǔ)。它確保在同一時(shí)間只有一個(gè)線程可以訪問(wèn)共享資源。要使用Mutex,你需要?jiǎng)?chuàng)建一個(gè)Mutex對(duì)象,然后在需要同步的代碼塊中使用lockunlock方法。

require 'thread'

mutex = Mutex.new

threads = []

10.times do
  threads << Thread.new do
    mutex.lock
    # 訪問(wèn)共享資源的代碼
    puts "Thread #{Thread.current.object_id} is executing"
    sleep 1
    mutex.unlock
  end
end

threads.each(&:join)
  1. 使用Semaphore(信號(hào)量):

Semaphore是一種限制同時(shí)訪問(wèn)共享資源的線程數(shù)量的同步原語(yǔ)。要使用Semaphore,你需要?jiǎng)?chuàng)建一個(gè)Semaphore對(duì)象,并設(shè)置允許同時(shí)訪問(wèn)的最大線程數(shù)。然后,在需要同步的代碼塊中使用acquirerelease方法。

require 'thread'

semaphore = Semaphore.new(3) # 允許最多3個(gè)線程同時(shí)訪問(wèn)

threads = []

10.times do
  threads << Thread.new do
    semaphore.acquire
    # 訪問(wèn)共享資源的代碼
    puts "Thread #{Thread.current.object_id} is executing"
    sleep 1
    semaphore.release
  end
end

threads.each(&:join)
  1. 使用ThreadGroup:

ThreadGroup允許你管理一組線程。你可以使用join方法等待組中的所有線程完成。雖然ThreadGroup本身不提供內(nèi)置的同步機(jī)制,但你可以結(jié)合其他同步原語(yǔ)(如Mutex)來(lái)同步線程組中的線程。

require 'thread'

group = ThreadGroup.new
mutex = Mutex.new

10.times do
  group.add_thread(Thread.new do
    mutex.lock
    # 訪問(wèn)共享資源的代碼
    puts "Thread #{Thread.current.object_id} is executing"
    sleep 1
    mutex.unlock
  end)
end

group.join

總之,為了正確同步Ruby線程,你需要根據(jù)具體需求選擇合適的同步原語(yǔ)(如Mutex、Semaphore或ThreadGroup),并在訪問(wèn)共享資源時(shí)使用適當(dāng)?shù)逆i定和解鎖方法。

0