# ロック class LockError < Exception; end class UnLockError < Exception; end def locking(lockdir, msg) msg = "LockError" r = nil begin lockflag = nil (0..9).each do |i| begin Dir.mkdir(lockdir) lockflag = true break rescue Errno::EEXIST lockflag = false end sleep(1) end raise LockError, msg unless lockflag r = yield ensure lockflag = nil begin Dir.rmdir(lockdir) lockflag = true rescue lockflag = false end raise UnLockError, msg unless lockflag end r end ## 簡単な使い方 # ロックをかけたい処理が deal だとして # ロック用に作成するディレクトリがカレントの lock_dir というディレクトリ名で # ロックに失敗した時に発生するエラーメッセージを LockError とする場合は # result に nil が入っていたらロックに失敗です # でも例外も発生してくれるんです result = locking('lock_dir', 'LockError') do deal end # バグがあったら教えて下さい。