gpt4 book ai didi

c++ - try_lock() +unlock() 是检查 boost::interprocess::file_lock 是否被锁定的有效方法吗?

转载 作者:太空宇宙 更新时间:2023-11-03 10:26:19 26 4
gpt4 key购买 nike

我需要使用 boost::interprocess::file_lock 检查文件是否被锁定。我制作了这个,但我担心它会做什么:

bool DataCache::isLocked() const {
bool res = lock_->try_lock();
if(res)
lock_->unlock();
return res;
}

这是个好主意吗?有没有不加锁就可以查看的方法呢?

最佳答案

虽然另一个答案是不引入竞争条件的关键,但没有理由放弃使用适当的 RAII 包装器(如 std::lock_guard<>)带来的异常安全性和错误恢复能力。和 std::unique_lock<> .

你想写:

if (auto lk = try_to_lock(mx)) {
std::cout << "simple test\n";
} // automatically unlocks at scope exit

你可以。这是我的简单实现:

template <typename Lockable>
std::unique_lock<Lockable> try_to_lock(Lockable& lockable) {
return std::unique_lock<Lockable> (lockable, std::try_to_lock);
}

Live On Coliru

#include <mutex>
#include <iostream>

int main() {
// demo
std::mutex mx;

if (auto lk = try_to_lock(mx)) {
std::cout << "simple test\n";
} // automatically unlocks at scope exit

if (auto lk = try_to_lock(mx)) {
std::cout << "yes\n";

if (auto lk = try_to_lock(mx)) {
std::cout << "oops?!\n"; // not reached
} else {
std::cout << "no recursive lock\n";
}

// but you can manipulate the lock if you insist:
lk.unlock();

if (auto lk = try_to_lock(mx)) {
std::cout << "now we can lock again\n";
} else {
std::cout << "oops?!\n"; // not reached
}
}
}

打印:

simple test
yes
no recursive lock
now we can lock again

关于c++ - try_lock() +unlock() 是检查 boost::interprocess::file_lock 是否被锁定的有效方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33524630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com