第二次检查后,鸡群锁丢失

时间:2015-11-16 16:05:12

标签: c++ c linux macos locking

我使用flock来阻止对共享资源的并发访问。它在第一次检查锁时工作正常,但是第二次检查锁时,我能够成功获取它,尽管锁是另一个进程保持的。

我使用以下代码:

#include <stdio.h>
#include <sys/file.h>
#include <errno.h>
int main(void) {

 printf("App started:\n");

 int fd = open("test.lock", O_RDWR | O_CREAT, 0666); // open or create   lockfile
 //check open success...
 int rc = flock(fd, LOCK_EX | LOCK_NB); // grab exclusive lock, fail if   can't obtain.
 if (rc)
 {
    printf("Failed .. lock is already held\n");
    if(EWOULDBLOCK == errno)
    {
      printf("errno said, that we would block\n");
    }
    return 0;
 }
 else
 {
   printf("Lock obtained\n");
 }

 printf("Press ENTER...\n");
 getc(stdin);
 return 0;
}

平台:OSX 10.10。

如果我在两个单独的终端窗口中运行程序,我会得到以下输出:

第一个窗口 - 应用程序获取锁定并等待按下键

  

应用已启动:   获得锁定   按ENTER ...

第二个终端窗口首次运行 - 应用程序发现,锁已被其他人持有

  

应用已启动:   失败..已经锁定了   errno说,我们会阻止

第二个终端窗口第二次运行 - 应用程序获得锁定,尽管第一个实例已经持有它

  

应用已启动:   获得锁定   按ENTER ...

好像测试锁定也会释放它......

有什么想法吗?

更新:这看起来与OS X相关的问题。代码在14.04 32位上没有问题。 马特拉

1 个答案:

答案 0 :(得分:0)

事实证明,OS X上的问题是该程序是从网络安装目录(Windows共享)运行的。锁在NFS上无法可靠地工作。有关详细信息,请参阅https://stackoverflow.com/a/22411531/174638