我应该使用什么同步机制来提供对boost文本文件的独占访问权限? 该文件可能只来自一个进程的线程。
答案 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
对象。答案 1 :(得分:2)
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)
如果您确定只能从一个进程访问它,那么在线程本地存储中具有文件句柄的读写锁可能是一种解决方案。这将模拟上述只有一个作家,但几个读者。