Leon's Blogging

Coding blogging for hackers.

Ruby - Mutex

| Comments

有時候會希望一個 block 東西都執行完,在執行下一個,如果是 db 的話可以用 樂觀鎖 與 悲觀鎖 Optimistic Locking & Pessimistic Locking,避免搶資源問題

但如果是像要發兩個 request 就可以使用 Mutex ,但要小心不要 deadlock (同時使用兩個,A 等待 B, B 等待 A),可以搭配 ConditionVariable,讓它等待另一個 signal 之後再繼續執行

Mutex implements a simple semaphore that can be used to coordinate access to shared data from multiple concurrent threads.

1
2
3
4
5
6
7
8
9
10
11
12
13
# 必須一開始就宣告,如果直接用  Mutex.new.synchronize 會導致每個用的 lock 不一樣
lock = Mutex.new

100.times do |num|
  Thread.new do
    lock.synchronize do
      puts "1. #{num}"
      sleep 3
      puts "2. #{num}"
      sleep 3
    end
  end
end

Reference

Comments