我有一個項目,包括多個進程,可以讀取或寫入到一個單一的數據庫。我希望使用系統調用flock/open/close來實現由鎖文件同步的單寫/多讀者鎖定。使用羊羣,打開和關閉文件來實現許多讀卡器單寫入鎖
一旦發生鎖定失敗,任何重新嘗試再次鎖定鎖定的操作都將由請求鎖定的較高級別進行(與自旋鎖定不同)。
不幸的是,在測試這個模型時,它在解鎖之前未被鎖定的情況下失敗。 也許你可以幫我找到我幹了什麼錯在這裏做的事:
// keep read and write file descriptors as global variables.
// assuming no more than 1 thread can access db on each process.
int write_descriptor=0;
int read_descriptor=0;
int lock_write() {
if((write_descriptor = open(LOCKFILE, O_RDWR|O_CREAT,0644))<0) {
return LOCK_FAIL;
}
if(flock(write_descriptor, LOCK_EX)<0) {
close(write_descriptor);
write_descriptor = 0;
return LOCK_FAIL;
}
return LOCK_SUCCESS;
}
int unlock_write() {
if(!write_descriptor) {
// sanity: try to unlock before lock.
return LOCK_FAIL;
}
if(flock(write_descriptor,LOCK_UN)<0) {
// doing nothing because even if unlock failed, we
// will close the fd anyway to release all locks.
}
close(write_descriptor);
write_descriptor = 0;
return LOCK_SUCCESS;
}
int lock_read() {
if((read_descriptor = open(LOCKFILE,O_RDONLY))<0) {
return LOCK_FAIL;
}
if(flock(read_descriptor, LOCK_SH)<0) {
close(read_descriptor);
return LOCK_FAIL;
}
return LOCK_SUCCESS;
}
int unlock_read() {
if(!read_descriptor) {
// sanity : try to unlock before locking first.
return LOCK_FAIL;
}
if(flock(read_descriptor, LOCK_UN)<0) {
// doing nothing because even if unlock failed, we
// will close the fd anyway to release all locks.
}
close(read_descriptor);
read_descriptor = 0;
return LOCK_SUCCESS;
}
int read_db() {
if(lock_read() != LOCK_SUCCESS) {
return DB_FAIL;
}
// read from db
if(unlock_read() != LOCK_SUCCESS) {
// close fd also unlock - so we can fail here (can i assume that ?)
}
}
int write_db() {
if(lock_write() != LOCK_SUCCESS) {
return DB_FAIL;
}
//write to db.
if(unlock_write() != LOCK_SUCCESS) {
// close fd also unlock - so we can fail here (can i assume that ?)
}
}
這個過程是多線程的嗎?如果是這樣,這將不起作用,因爲文件鎖由進程擁有,而不是線程。 –
@DavidSchwartz,嗨。正如我在問題中提到的,我假設每個進程只有一個線程處理鎖(這就是爲什麼我可以使用全局變量。 – Zohar81
你能更準確地知道它是如何失敗的嗎?(另外,爲什麼這個標籤'multithreading'?) –