使用LockFile的死锁

时间:2014-05-11 22:15:42

标签: c windows locking deadlock file-locking

我有两个线程,我需要读取和写入相同的文件,并且必须锁定我必须读取和写入的文件部分。 特别是我使用特定的偏移量读取了一个自定义结构(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;

问题是我遇到了僵局,例如:

  1. Thread 1锁定第一个帐户(偏移0)
  2. Thread 2尝试锁定第一个帐户(偏移0)并等待Thread 1释放锁定(正如预期的那样)
  3. Thread 1解锁第一个帐户(偏移0)
  4. 嗯,在第3点,Thread 1也被阻止了 为什么?我该如何解决这个问题?

0 个答案:

没有答案