0

我正在寻找一种方法以不受竞争条件影响的方式将文件大小增加到至少 N 个字节。

当然,简单的方法有一个竞争条件:

LARGE_INTEGER large_int;
GetFileSizeEx(handle, &large_int);
if (large_int.QuadPart < N) {
  SetFilePointerEx(handle, N, 0, FILE_BEGIN);
  SetEndOfFile(handle);
}

有任何想法吗?

编辑:详细说明比赛条件:

初始文件大小为零。Alice 想要将大小设置为至少 100。Bob 想要将大小设置为至少 200。很明显,如果没有竞态条件,那么当 Alice 和 Bob 都完成时,文件的大小必须为至少200。

假设 Alice 和 Bob 都将当前文件大小读取为零。然后 Bob 看到他需要将大小增加到 200,因此他将大小设置为 200。现在 Alice 开始运行,她得出结论 100 大于零,她认为这是当前大小,然后她设置大小为 100。

4

2 回答 2

1

使用文件锁定确保只有一个进程在处理文件。

大概是这样的:

check file size, if too small then
  Lock file
  check size again
  set size if needed
  Unlock file
于 2013-01-23T02:31:08.760 回答
0

我找到了一种方法:

DWORD protect = PAGE_READONLY;
LARGE_INTEGER large_int;
large_int.QuadPart = desired_minimum_size;
HANDLE map_handle = CreateFileMapping(file_handle, 0, protect, large_int.HighPart, large_int.LowPart, 0);
CloseHandle(map_handle);

我想知道与我上面提到的幼稚方法相比,这样做的开销是多少。

显然,无论该文件是否已经存在,都可以创建一个新的文件映射对象。在这方面,文档非常模糊,但我已经检查过它是否有效。

于 2013-02-02T17:39:24.540 回答