【发布时间】:2019-11-24 14:45:09
【问题描述】:
标准的 linux fcntl 调用不提供超时选项。我正在考虑使用信号实现超时锁定。
这里是阻塞锁的描述:
F_SETLKW
这个命令应该等同于F_SETLK,除了如果共享或排他锁被其他锁阻塞,线程将等待直到请求被满足。 如果在 fcntl() 等待区域时接收到要捕获的信号,则 fcntl() 应被中断。 从信号处理程序返回时,fcntl() 应返回 -1 和 errno设置为[EINTR],不做锁操作。
那么我需要使用什么样的信号来指示要中断的锁呢?而且由于我的进程中有多个线程在运行,我只想中断这个阻塞文件锁的IO线程,其他线程不应该受到影响,但是信号是进程级别的,我不知道如何处理这种情况。
补充:
我用信号写了一个简单的实现。
int main(int argc, char **argv) {
std::string lock_path = "a.lck";
int fd = open(lock_path.c_str(), O_CREAT | O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO);
if (argc > 1) {
signal(SIGALRM, [](int sig) {});
std::thread([](pthread_t tid, unsigned int seconds) {
sleep(seconds);
pthread_kill(tid, SIGALRM);
}, pthread_self(), 3).detach();
int ret = file_rwlock(fd, F_SETLKW, F_WRLCK);
if (ret == -1) std::cout << "FAIL to acquire lock after waiting 3s!" << std::endl;
} else {
file_rwlock(fd, F_SETLKW, F_WRLCK);
while (1);
}
return 0;
}
通过运行./main,然后运行./main a,我希望第一个进程永远持有锁,第二个进程尝试获取锁并在 3 秒后中断,但第二个进程刚刚终止。
谁能告诉我我的代码有什么问题?
【问题讨论】:
-
您添加的代码是 C++,而不是 C。如果您实际上是在寻找有关 C++ 的答案,请适当地标记问题 - C++ 的答案可能与 C 的答案不同。跨度>
标签: c linux multithreading file-locking