羊群不阻塞

Abr*_*ile 1 c c++ linux concurrency file

我想同步对文件的访问。我正在使用 Linux 和 g++。

我想使用函数锁定文件flock()。我开发了两个测试应用程序,在同一文件中写入和读取。他们都flock()用打电话LOCK_SH

作家先开始写作,然后睡觉。第二个应用程序稍后启动。我期望看到读取器应用程序在调用时阻塞,flock()因为写入器进程没有释放锁。

这是正确的期望还是它们仅在同时调用 和 时(即在同一时间)才会read()阻塞write()?我误解了什么?

    PROG A                PROG B
    -open file
    -flock                -open file
    -write                -sleep 5     
    -sleep 1000           -flock    ** expected to block ?? **
    -close                -read data
Run Code Online (Sandbox Code Playgroud)

zch*_*zch 5

flock仅当至少一个进程使用它时才会阻塞LOCK_EX

  • 如果某个进程持有排它锁,则任何尝试获取排它/共享锁的进程都将被阻止。
  • 如果某个进程持有共享锁,则尝试获取排他锁的进程将被阻止。

一般来说,您应该使用共享锁进行读取,使用独占锁进行写入或读/写。