Согласованность двух потоков C FILE * в одном файле - PullRequest
2 голосов
/ 10 марта 2011

Мне нужно реализовать простой слой "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;
}

(И спасибо всем за вклад в это - очень признателен).

Ответы [ 2 ]

4 голосов
/ 10 марта 2011

Это звучит как идеальный вариант для ввода-вывода с отображением в памяти.Он гарантированно будет согласованным, очень быстрым, а отслеживание нескольких указателей будет простым.

Вам понадобятся разные функции для настройки отображения памяти в разных ОС, но реальный ввод-вывод полностью переносим (с использованием указателя)

  • linux: open, mmap
  • Windows: CreateFileMapping, MapViewOfFile
2 голосов
/ 10 марта 2011

Это определенно не даст вам семантику, которую вы хотите. Если вы отключили буферизацию, было бы разумно ожидать, что она будет работать, но я все еще не думаю, что есть какие-либо гарантии. Stdio / FILE на самом деле не является подходящим инструментом для специализированных нужд ввода-вывода, подобных этому.

POSIX позволяет делать то, что вам нужно, с помощью файловых дескрипторов и функций pread / pwrite. Я подозреваю, что есть способ Windows (или вы могли бы эмулировать их, основываясь на каком-то другом базовом примитиве Windows), но я этого не знаю.

Также предложение Бена использовать IO с отображением в памяти является очень хорошим, если файл помещается в ваше адресное пространство.

...