十進 BASIC で排他ロック
〜 資源を共有 〜
2022-12-12 作成 福島
2023-07-07 更新 福島
TOP > asob > decbasic-exlock
[ TIPS | TOYS | OTAKU | LINK | MOVIE | CGI | AvTitle | ConfuTerm | HIST | AnSt | Asob ]

十進 BASIC で排他ロックが必要な人なんてちょっと居ないと思いますが、よもや気が触れたあなたのためにここに書いておきます。
ロックファイルにはディレクトリを使用しているので Linux、Windows を問わず使えますが、自動解除*1 は Windows 専用です。
(*1予期しないシャットダウン等、何かの原因でロックファイルが残ったままになっても自動的にロックを外す機能。ファイル日付の取得に Win32 API が必須)

以前掲載した Python 用排他ロックPHP 用排他ロックと連携することができます。
十進 BASIC を商用で使う人は居ないと思いますが、商用/非商用を問わず、自由にコピーして使ってください。

最近は PC に SSD を使うことが増えてきました。
SSD のシステムではストレージに負荷をかけないよう、ロックファイルの保存先として
Linux では tmpfs を、Windows では RAM ディスクを使用してください。

ロックファイルがディレクトリなので SMB を使ってファイルサーバや他 PC の共有ディスクを指定することもできます。

N:\share\lockDir.LCK --- N: にネットワークドライブを割り当てた場合の例。
\\192.168.0.1\share\lockDir.LCK --- IP アドレスを直に指定する場合の例。


排他ロックが必要な理由はここを参照してください。
要するに、
「名前を書かないプリンは家族の誰かに食べられてしまうかもしれない」
というのと同じ理屈です。


exLock.BAS --  自動解除なし (汎用版)
exLockWin.BAS --  自動解除あり (Windows 専用版)
ファイル名は異なりますが、プロシージャ名は同じです。(ExLock_lock / Exlock_unlock)

exLockWin.BAS は日付の計算に「フェアフィールドの公式」を使用しています。
フェアフィールドの公式について、出自(しゅつじ)を調査してくださった方がいます。
(ツェラーの公式の発表のほうが先なのにフェアフィールドの公式を変形したことになっているらしい。さては、「科学者」が何かしたのでは?)

なんとも怪しげだけど、エポック秒 (西暦 1970 年以前は対象外) より便利だからこのまま使っちゃいます。
(実は、MS-DOS 由来である Windows のファイル日付のほうが不正確だったりする)


いずれにせよ、MAKE DIRECTORY の実装がアトミックのままだから大丈夫。
使い方は R:\lock_tmp\ というディレクトリを予め作成したとして、こんな感じ
DECLARE EXTERNAL FUNCTION ExLock_lock
DECLARE EXTERNAL SUB ExLock_unlock

LET lockPath$ = "R:\lock_tmp\lockDir.LCK"
LET lock = ExLock_lock(lockPath$)
IF lock <> 0 THEN
    ! ロック中に実行する処理
END IF
CALL ExLock_unlock(lockPath$, lock)

END

MERGE "exLock.BAS"
Windows 専用版は "exLock.BAS" → "exLockWin.BAS" と読み替えてください。
ホントはクラスを使って記述したいけど、無いものは無いので仕方がない。