int _lock_fd(int fd) {
struct flock fl;
memset(&fl, 0, sizeof(struct flock));
fl.l_type = F_WRLCK;
fl.l_whence = SEEK_SET;
if (fcntl(fd, F_SETLKW, &fl) == -1) {
return -1;
}
return 0;
}
int _unlock_fd(int fd) {
struct flock fl;
memset(&fl, 0, sizeof(struct flock));
fl.l_type = F_UNLCK;
fl.l_whence = SEEK_SET;
if (fcntl(fd, F_SETLK, &fl) == -1) {
return -1;
}
return 0;
}
这是常用的linux文件锁
特点:(1)速度很快 2.7GHz的cpu上几个微妙就能进入锁
(2)等待特点:跨进程时,会等,如A进程进入锁定,则B进程要等到A进程解锁后才能加锁
(3)同进程内的情况,当A线程锁定,则B线程不会等,而是直接返回锁定失败
因此如果实现类似Windows的Mutex特点,需要再进入文件锁前进入一个进程内的临界区
bool CProcessMutex::Lock() {
//mutex lock first
m_mutex.lock();
long long cur_tid = GetCurrentTid();
if (cur_tid == m_currentThreadID)
return true;
m_currentThreadID = cur_tid;
bool bLockSem = LockFile();
if (!bLockSem) {
m_currentThreadID = 0;
m_mutex.unlock();
return false;
}
return true;
}
bool CProcessMutex::UnLock() {
if (UnLockFile()) {
m_currentThreadID = 0;
m_mutex.unlock();
return true;
}
return false;
}