File#flock
This script is written to check the function of
flock
. The same file is accessed by several threads. In
each thread, a number is read from the file, incremented, and written
to the file. If flock
works well, the number written to
the file finally should be equal to the total number of iterations.
The procedure of file access is as follows;
r+
)Below is the script for checking the function of flock
.
#!/usr/local/bin/ruby # flock00.rb : test for flock # 1999/12/20 11:28:15 msato # $Id: flock-en.uhtml,v 1.4 2000-01-04 18:44:49+09 msato Exp $ require 'thread' $fname = 'count.dat' $number_of_threads = 5 $number_of_iteration = 3000 $indent = "\t" def count(num) $number_of_iteration.times do open($fname, "r+") do |f| f.flock(File::LOCK_EX) # <==== lock count = f.gets.to_i + 1 f.rewind f.print count # f.flock(File::LOCK_UN) # <==== unlock $stderr.print $indent * num, count, "\n" end end end begin open($fname, "w") do |f| f.print "0" end rescue $stderr.print "Cannot open #{fname}\n" exit 1 end th = [] 0.upto ($number_of_threads - 1) do |num| th[num] = Thread.start { count(num) } end 0.upto ($number_of_threads - 1) do |num| th[num].value end print "Count = #{$number_of_threads * $number_of_iteration}\n" File::delete($fname)
The operation of the file is carried out in count
function. Run the script with changing
f.flock(File::LOCK_EX)
or f.flock(File::LOCK_UN)
.
The results of my tests are as follows;
In this test, it was OK to unlock the file explicitly before closing. However, I've heard the data remained in the buffer result in something wrong when unlocking explicitly before closing.
In the script above, Thread#value
is used to suspend the
main thread until each thread terminates. But usually,
Thread#join
is used for this purpose. I haven't noticed
Thread#join
during programming :-)
Feel free to mail me
sato.mshr@gmail.comCopyright (C) 2000 Masahiro SATO