在這個例子中,我正在尋找同步兩個puts
,輸出將是ababab...
,輸出上沒有任何雙重a
s或b
s。互斥鎖不工作,使用隊列工作。爲什麼?
我有三個例子:使用隊列,在內存中使用互斥鎖和使用互斥鎖與文件。隊列示例工作得很好,但互斥對象不。
我不是在尋找一個工作代碼。我正在理解爲什麼使用它的工作隊列,而使用互斥鎖則不行。根據我的理解,它們應該是等同的。
隊列示例:工作。
def a
Thread.new do
$queue.pop
puts "a"
b
end
end
def b
Thread.new do
sleep(rand)
puts "b"
$queue << true
end
end
$queue = Queue.new
$queue << true
loop{a; sleep(rand)}
互斥體文件示例:不工作。
def a
Thread.new do
$mutex.flock(File::LOCK_EX)
puts "a"
b
end
end
def b
Thread.new do
sleep(rand)
puts "b"
$mutex.flock(File::LOCK_UN)
end
end
MUTEX_FILE_PATH = '/tmp/mutex'
File.open(MUTEX_FILE_PATH, "w") unless File.exists?(MUTEX_FILE_PATH)
$mutex = File.new(MUTEX_FILE_PATH,"r+")
loop{a; sleep(rand)}
互斥變量示例:不工作。
def a
Thread.new do
$mutex.lock
puts "a"
b
end
end
def b
Thread.new do
sleep(rand)
puts "b"
$mutex.unlock
end
end
$mutex = Mutex.new
loop{a; sleep(rand)}
@sawa看看這個問題 – fotanus
唉,我沒有得到賞金?不過,很高興能有所幫助。 – Kache