在这个例子中,我正在寻找同步两个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