我有一個文件名數組,每個進程只需要創建和寫入一個文件。以線程安全的方式創建文件
這就是我來:
foreach ($filenames as $VMidFile) {
if (file_exists($VMidFile)) { // A
continue;
}
$fp = fopen($VMidFile, 'c'); // B
if (!flock($fp, LOCK_EX | LOCK_NB)) { // C
continue;
}
if (!filesize($VMidFile)) { // D
// write to the file;
flock($fp, LOCK_UN);
fclose($fp);
break;
}
flock($fp, LOCK_UN);
fclose($fp); // E
}
但我不喜歡這樣,我依靠filesize
。
任何建議以另一種(更好)的方式做到這一點?
UPD:添加標籤,輕鬆地討論
UPD 2:我使用filesize
,因爲我沒有看到任何其他可靠的方法來檢查,如果當前線程創建的文件(因此,它是空的)
UPD 3:該解決方案應該條件種族免費。
你試圖通過這樣做解決什麼問題? – cgTag
@Mathew Foscarini:它管理沒有併發同步的第三方資源。 – zerkms