我需要爲來自網絡套接字的大量數據實現一個簡單的「溢出到磁盤」層。我希望有兩個C FILE*
流,一個由寫入文件的後臺線程使用,另一個由讀取它的前端線程使用。單個文件上兩個C FILE *流的一致性
兩個流這樣一個線程可在一個偏移來寫,而另一種是閱讀別處 - 不以鎖定並阻止其他線程。
會有分頁機制,所以讀/寫操作在隨機訪問的地點 - 不一定是連續的。
還有一點需要注意,這需要在Windows和Linux上運行。
的問題:fwrite的第一流返回之後,則寫入數據保證是立即可見對第二流的FREAD?
如果不是,我可以考慮哪些其他選項?
所以Posix的PREAD/PWRITE功能竟然是我所需要的。這裏是一個用於Win32的版本:
size_t pread64(int fd, void* buf, size_t nbytes, __int64 offset)
{
OVERLAPPED ovl;
memset(&ovl, 0, sizeof(ovl));
*((__int64*)&ovl.Offset)=offset;
DWORD nBytesRead;
if (!ReadFile((HANDLE)_get_osfhandle(fd), buf, nbytes, &nBytesRead, &ovl))
return -1;
return nBytesRead;
}
size_t pwrite64(int fd, void* buf, size_t nbytes, __int64 offset)
{
OVERLAPPED ovl;
memset(&ovl, 0, sizeof(ovl));
*((__int64*)&ovl.Offset)=offset;
DWORD nBytesWritten;
if (!WriteFile((HANDLE)_get_osfhandle(fd), buf, nbytes, &nBytesWritten, &ovl))
return -1;
return nBytesWritten;
}
(謝謝大家對此的反饋 - 非常感謝)。
這個數據每秒多少,處理它需要多長時間,驅動器有多快?在每個時間片上尋找光盤上文件不同部分的兩個線程可能會使硬盤驅動器像Mix-Master Mike一樣工作。你考慮過內存映射文件嗎? – gpcz 2011-03-10 02:05:01
@gpcz:只有在一個真正破壞的操作系統中,寫入實際上會導致在底層存儲介質上尋找... – 2011-03-10 02:12:53
@gpcz:在此之上會有一層分頁緩存(我簡化了問題)我並不擔心這一點。 – 2011-03-10 02:24:42