我有一个c ++类,基本上在构造函数中打开一个文件,在ReadAcquire()或WriteAcquire()成员函数中fld fd如下:flock(fd,(IsReaderLock?LOCK_SH:LOCK_EX)| LOCK_NB),并关闭fd在Release()成员函数中。然后我运行了这个测试代码:
for (int i = 0; i < 10000; i++)
{
FileLock lock1("/tmp/Test");
VERIFY_IS_TRUE(lock1.WriteAcquire().IsSuccess());
lock1.Release();
FileLock lock2("/tmp/Test");
VERIFY_IS_TRUE(lock2.ReadAcquire().IsSuccess());
lock2.Release();
}
它在一个简单的测试程序中工作正常。但是在一个复杂的程序中(多线程运行,许多基于实时信号的定时器等),经常会发生ReadAcquire()或WriteAcquire()中的flock()调用将失败,错误代码为11,即EWOULDBLOCK,我从来没有得过EINTR。通过重试,它通常在间隔1ms的最多5次重试中恢复。这种行为有什么解释吗?我假设close(fd)应立即释放羊群。谢谢。