在boost :: interprocess中win32文件锁定的模拟是什么?

时间:2009-01-28 07:46:51

标签: c++ multithreading boost ipc

我应该使用什么同步机制来提供对boost文本文件的独占访问权限? 该文件可能只来自一个进程的线程。

3 个答案:

答案 0 :(得分:3)

文件锁定API通常用于进程间锁定。如果您处于单一流程中,Boost.Thread package中符合您需求的所有内容都可以。在外部流程中,应使用Boost.Interprocess。您可能希望从Boost.Interprocess中读取以下警告:

Caution: Synchronization limitations

如果您计划像命名互斥锁一样使用文件锁,请注意,因为可移植文件锁具有同步限制,主要是因为不同的实现(POSIX,Windows)提供了不同的保证。进程间文件锁具有以下限制:

  • 如果file_lock同步来自同一进程的两个线程,则未指定。
  • 如果进程可以使用指向同一文件的两个file_lock对象,则未指定。

第一个限制主要来自POSIX,因为文件句柄是每个进程属性而不是每个线程属性。这意味着如果一个线程使用file_lock对象来锁定文件,则其他线程会将该文件视为已锁定。另一方面,Windows文件锁定机制提供线程同步保证,因此试图锁定已锁定文件的线程将阻塞。

第二个限制来自于文件锁定同步状态与Windows中的单个文件描述符绑定的事实。这意味着如果创建了两个指向同一文件的file_lock对象,则不保证同步。在POSIX中,如果关闭描述符,则使用两个文件描述符来锁定文件时,将清除调用进程设置的所有文件锁。

总而言之,如果您计划在流程中使用文件锁定,请使用以下限制:

  • 对于每个文件,每个进程使用一个file_lock对象。
  • 使用相同的线程锁定和解锁文件。
  • 如果您使用std :: fstream / native文件句柄在该文件上使用文件锁时写入该文件,请不要在释放该文件的所有锁之前关闭该文件。

答案 1 :(得分:2)

我想是acquire_file_lock

inline bool acquire_file_lock(file_handle_t hnd)
{
   struct ::flock lock;
   lock.l_type    = F_WRLCK;
   lock.l_whence  = SEEK_SET;
   lock.l_start   = 0;
   lock.l_len     = 0;
   return -1 != ::fcntl(hnd, F_SETLKW, &lock);
}

non-boost implementation of a lock一致。

    struct flock fl = {F_WRLCK, SEEK_SET,   0,      0,     0 };
    int fd;

    fl.l_pid = getpid();

    if (argc > 1) 
        fl.l_type = F_RDLCK;

    if ((fd = open("lockdemo.c", O_RDWR)) == -1) {
        perror("open");
        exit(1);
    }

    printf("Press <RETURN> to try to get lock: ");
    getchar();
    printf("Trying to get lock...");

    if (fcntl(fd, F_SETLKW, &fl) == -1) {
        perror("fcntl");
        exit(1);
    }

    printf("got lock\n");
    printf("Press <RETURN> to 

答案 2 :(得分:1)

如果您确定只能从一个进程访问它,那么在线程本地存储中具有文件句柄的读写锁可能是一种解决方案。这将模拟上述只有一个作家,但几个读者。