我有两个线程,我需要读取和写入相同的文件,并且必须锁定我必须读取和写入的文件部分。
特别是我使用特定的偏移量读取了一个自定义结构(account_t
),我更新了这个结构,并在同一偏移处再次写入它。
以下是代码的主要部分:
if (LockFileEx(handle, LOCKFILE_EXCLUSIVE_LOCK, 0, sizeof(account_t), 0, &ov))
{
// read account using ov as offset
// update the account
// write the account using ov as offset
UnlockFile(handle, filePos.LowPart, filePos.HighPart, sizeof(account_t), 0);
}
ov
总是在哪里:
LARGE_INTEGER filePos;
OVERLAPPED ov = { 0, 0, 0, 0, NULL };
filePos.QuadPart = myOffset;
ov.Offset = filePos.LowPart;
ov.OffsetHigh = filePos.HighPart;
问题是我遇到了僵局,例如:
Thread 1
锁定第一个帐户(偏移0)Thread 2
尝试锁定第一个帐户(偏移0)并等待Thread 1
释放锁定(正如预期的那样)Thread 1
解锁第一个帐户(偏移0)嗯,在第3点,Thread 1
也被阻止了
为什么?我该如何解决这个问题?