我的平台是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)
老实说,写入同一个文件甚至没有大问题。
到目前为止,最简单的方法是仅对文件进行内存映射。然后操作系统会给你一个 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)
| 归档时间: |
|
| 查看次数: |
29746 次 |
| 最近记录: |