一共有兩種鎖嬉荆,6中組合:
- 共享鎖 LOCK_SH
- 獨(dú)占鎖 LOCK_EX
- 外加 [無鎖] 狀態(tài)
LOCK_SH + 無鎖
A 進(jìn)程使用 LOCK_SH 钉稍,可以讀焙畔,可以寫捎琐。
B 進(jìn)程無鎖蓄髓,可以讀叉庐,無法寫。(但實測双吆,直接 fwrite 失敗眨唬,先 fread 一下,然后 fwrite 就可以成功)
LOCK_EX + 無鎖
A 進(jìn)程使用 LOCK_EX好乐,可以讀匾竿,可以寫。
B 進(jìn)程無鎖蔚万,無法讀(fread 返回空)岭妖,無法寫(fwrite 失敗)
LOCK_SH + LOCK_EX
LOCK_EX + LOCK_SH
LOCK_EX + LOCK_EX
- 使用獨(dú)占鎖反璃,在未解鎖前昵慌,其他進(jìn)程想要加鎖會被阻塞直至解鎖為止
- 其他進(jìn)程加鎖,新進(jìn)程想要使用獨(dú)占鎖淮蜈,也會被阻塞直到其他進(jìn)程解鎖(哪怕其他進(jìn)程使用的是共享鎖)
例如:
A 進(jìn)程使用 LOCK_SH 斋攀,可以讀,可以寫梧田。
B 進(jìn)程使用 LOCK_EX 淳蔼,會被阻塞,在 A 繼承解鎖前程序阻塞等待A 進(jìn)程使用 LOCK_EX 裁眯,可以讀鹉梨,可以寫。
B 進(jìn)程使用 LOCK_SH穿稳,會被阻塞存皂,在 A 繼承解鎖前程序阻塞等待
LOCK_SH + LOCK_SH
與 LOCK_SH + 無鎖 表現(xiàn)一致
A 進(jìn)程 LOCK_SH 、B 進(jìn)程 LOCK_SH 不會被阻塞逢艘,可以讀旦袋,無法寫(通用的骤菠,先讀后寫就可以成功)
不同的是,若有 C 進(jìn)程想使用 LOCK_EX 猜憎, 必須等待 A B 進(jìn)程都解鎖
LOCK_UN
解鎖娩怎,沒啥好說的
LOCK_NB
用于組合使用,不阻塞胰柑,比如
flock($fp, LOCK_EX | LOCK_NB)
由于該特性 Unix Only截亦,盡量不使用,避免程序在跨平臺時出現(xiàn)問題