[英]How to use pthread in C to prevent simultaneous read and write to a file on disk?
我正在編寫一個程序,該程序具有一個寫線程和幾個讀線程,它們可以對磁盤上的文件進行寫/讀操作。 我希望不會同時發生寫入/讀取。 我發現了許多在寫/讀期間使用pthread互斥鎖來保護內存陣列的示例,例如聲明受保護的內存陣列為volatile。
volatile int array[NUMBER];
pthread_mutex_t locks[NUMBER];
pthread_mutex_lock(&locks[index]);
array[acct] -= SOME_NUMBER;
pthread_mutex_unlock(&locks[index]);
但是我找不到使用pthread保護磁盤上文件的示例。
volatile FILE* array[NUMBER]; ??
有人可以指出我正確的方向嗎? 我希望寫/讀線程不會同時訪問磁盤上的文件。
編輯:我讀了更多,並且根據這篇文章 ,似乎多線程不適用於磁盤IO。
根據描述,您的問題與保護磁盤上的文件有關,而不是與代表文件的流描述符( FILE*
)有關。 您可以嘗試使用pthread的rwlock同步多個線程之間的並發訪問:
FILE *fp = fopen(...);
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
// read thread:
char buf[BUFLEN];
pthread_rwlock_rdlock(&rwlock);
fread(buf, sizeof buf, 1, fp);
pthread_rwlock_unlock(&rwlock);
// write thread:
pthread_rwlock_wrlock(&rwlock);
fwrite(buf, sizeof buf, 1, fp);
pthread_rwlock_unlock(&rwlock);
請注意,這可以防止文件被同一進程中的多個線程訪問,這不能保護文件不被系統上的多個進程訪問。
這取決於您的意思是“將不會同時訪問磁盤上的文件”。 由於您談論的是pthreads,這意味着您正在使用POSIX系統。 POSIX已經對多個進程和線程進行文件訪問提供了某些保證。
如果您使用原始的系統調用read
和write
您例如保證寫入將是原子。 這意味着,如果read
和write
同時發生(意味着:您不知道哪個首先開始),則讀取將看到寫入所做的文件的全部更改,或者全部都看不到(此處可能會有一些例外)錯誤)。 當然,由於多個線程讀取和寫入同一文件描述符存在問題,因為讀取/寫入會更新將在下一次讀取/寫入發生的偏移量。 因此,如果其他一些線程可以在查找和寫入之間觸摸文件描述符,則先進行lseek
然后write
是不安全的。 但是為此,您需要系統調用pread
和pwrite
,以確保seek + read / write將是原子的。
因此,僅需進行問題描述的這一部分:
一個寫線程和幾個讀線程,它們對磁盤上的文件進行寫/讀。 我希望不會同時發生寫入/讀取。
操作系統已經保證了這一點。 我認為的問題是“同時”是一個非常模糊的要求,因為幾乎沒有任何事情同時發生在訪問共享資源(例如文件或什至是內存)上。 在考慮線程或任何並發性時,您需要根據在發生其他事情之前/之后發生的事情來構造問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.