多个线程从同一个文件读取

anr*_*ru 10 c c++ file-io

我的平台是windows vista 32,带有visual c ++ express 2008.

例如:

如果我有一个包含4000个字节的文件,我可以同时从文件中读取4个线程吗?并且每个线程访问文件的不同部分.

线程1读取0-999,线程2读取1000 - 2999等.

请举一个C语言的例子.

Fra*_*cis 21

如果你不写信给他们,则无需照顾同步/竞争条件.

只需打开共享阅读文件作为不同的句柄,一切都会工作.(即,您必须在线程的上下文中打开文件,而不是共享相同的文件句柄).

#include <stdio.h>
#include <windows.h>

DWORD WINAPI mythread(LPVOID param)
{
    int i = (int) param;
    BYTE buf[1000];
    DWORD numread;

    HANDLE h = CreateFile("c:\\test.txt", GENERIC_READ, FILE_SHARE_READ,
        NULL, OPEN_EXISTING, 0, NULL);

    SetFilePointer(h, i * 1000, NULL, FILE_BEGIN);
    ReadFile(h, buf, sizeof(buf), &numread, NULL); 
    printf("buf[%d]: %02X %02X %02X\n", i+1, buf[0], buf[1], buf[2]);

    return 0;
}

int main()
{
    int i;
    HANDLE h[4];

    for (i = 0; i < 4; i++)
        h[i] = CreateThread(NULL, 0, mythread, (LPVOID)i, 0, NULL);

    // for (i = 0; i < 4; i++) WaitForSingleObject(h[i], INFINITE);
    WaitForMultipleObjects(4, h, TRUE, INFINITE);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • WaitForSingleObject()的循环应该用一个WaitForMultipleObjects()调用替换.除此之外它是+1. (2认同)

MSa*_*ers 6

老实说,写入同一个文件甚至没有大问题。

到目前为止,最简单的方法是仅对文件进行内存映射。然后操作系统会给你一个 void* 文件被映射到内存中。将其转换为 char[],并确保每个线程使用不重叠的子数组。

void foo(char* begin, char*end) { /* .... */ }
void* base_address = myOS_memory_map("example.binary");
myOS_start_thread(&foo, (char*)base_address, (char*)base_address + 1000);
myOS_start_thread(&foo, (char*)base_address+1000, (char*)base_address + 2000);
myOS_start_thread(&foo, (char*)base_address+2000, (char*)base_address + 3000);
Run Code Online (Sandbox Code Playgroud)