Мне нужно реализовать простой слой "spill to disk" для большого объема данных, поступающих из сетевого сокета.Я надеялся получить два потока C FILE*
, один из которых использовался фоновым потоком для записи в файл, а другой - внешним потоком, читающим его.
Два потока предназначены для записи в один потокодно смещение, в то время как другое читает в другом месте - без блокировки и блокировки другого потока.
Будет механизм подкачки, поэтому операции чтения / записи будут в местах произвольного доступа - не обязательно последовательных.
Еще одно предостережение, это должно работать в Windows и Linux.
Вопрос: после возврата fwrite в первый поток, эти записанные данные гарантированно будут сразу же видны для фреда во второмstream?
Если нет, то какие еще варианты я мог бы рассмотреть?
Так что функции 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;
}
(И спасибо всем за вклад в это - очень признателен).