當有多個工作線程要同時對一個文件進行寫操作時,如果不對該文件進行加鎖就可能會因誤操作而引起一系列的問題。
解決這個問題有多種方法。我們這裡考慮使用文件鎖來對文件進行保護,因為這個方法簡單易行。具體方法是使用Flock函數進行加鎖:
if((flock(fd, LOCK_EX | LOCK_NB))< 0)
{
std::cout<<"Log::The log have been locked"<<std::endl;
return FALSE;
}
使用LOCK_EX是對文件描述符fd進行加鎖,如果成功,返回0,表示該文件還沒有被加鎖,可以對其進行寫操作。如果失敗返回-1,表示該文件已經被加鎖,正在被使用,故要等到其解鎖後才能使用。
LOCK_NB表示非阻塞。加鎖後對該文件的具體寫操作如下:
if((flock(fd, LOCK_UN ))<0)
{
std::cout<<"Log::unlock the logfile error"<<std::endl;
return FALSE;
}
這是在文件處理完後,對文件進行解鎖,解鎖後,其他線程就可以對該文件進行訪問了。