簡體   English   中英

如何在C中使用pthread防止同時讀寫磁盤上的文件?

[英]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已經對多個進程和線程進行文件訪問提供了某些保證。

如果您使用原始的系統調用readwrite您例如保證寫入將是原子。 這意味着,如果readwrite同時發生(意味着:您不知道哪個首先開始),則讀取將看到寫入所做的文件的全部更改,或者全部都看不到(此處可能會有一些例外)錯誤)。 當然,由於多個線程讀取和寫入同一文件描述符存在問題,因為讀取/寫入會更新將在下一次讀取/寫入發生的偏移量。 因此,如果其他一些線程可以在查找和寫入之間觸摸文件描述符,則先進行lseek然后write是不安全的。 但是為此,您需要系統調用preadpwrite ,以確保seek + read / write將是原子的。

因此,僅需進行問題描述的這一部分:

一個寫線程和幾個讀線程,它們對磁盤上的文件進行寫/讀。 我希望不會同時發生寫入/讀取。

操作系統已經保證了這一點。 我認為的問題是“同時”是一個非常模糊的要求,因為幾乎沒有任何事情同時發生在訪問共享資源(例如文件或什至是內存)上。 在考慮線程或任何並發性時,您需要根據在發生其他事情之前/之后發生的事情來構造問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM