ファイルを unlock して問題になるくらいなら、OS 任せにするほうがよい

476 名前: デフォルトの名無しさん  Mail: sage 投稿日: 2008/03/05(水) 23:48:04 
ファイルの排他制御のテストプログラムを書いています。
ただ単に1つのカウントファイルを100万回インクリメントするプログラム

#!/usr/bin/env python

for i in range(1000000) :
  f = open("count-file", "r+")
  fcntl.flock(f.fileno(), fcntl.LOCK_EX)
  cnt = f.readline()
  cnt = int(cnt) + 1
  f.seek(0)
  f.write("%d\n" % cnt)
  fcntl.flock(f.fileno(), fcntl.LOCK_UN)
  f.close()

を同時に2つ実行するとcount-fileの値が
2000000
になるはずが、
1984329
という風に途中で欠けてしまいます。但し1つ実行する分には正常に動作します。
排他制御がうまくいってないようなのですがどこがいけないのでしょうか。
flockの部分をlockfにしても変化はありません。

OS Gentoo、python 2.5.1


477 名前: デフォルトの名無しさん  Mail: sage 投稿日: 2008/03/05(水) 23:52:06 
LOCK_UN の前に flush?


478 名前: デフォルトの名無しさん  Mail: sage 投稿日: 2008/03/05(水) 23:56:25 
>>477
まさにおっしゃる通りでしたorz
的確なアドバイス助かりました m(_ _)m


f.flush() を追加するのでもいいけど、LOCK_UN を実行しないというのでもいいよね。

MS-DOS ならいざ知らず、最近の OS なら f.close() するときに「バッファの flush」と「ファイルの unlock」の両方をしてくれる。つまり OS が面倒見てくれるから、必要な後処理は OS に任せてしまいましょう、ということ。プログラマーが勝手に unlock して問題になるくらいなら、OS 任せにしたほうがいい。resource を管理するために OS があるんだから。