我需要使用boost::interprocess::file_lock
检查文件是否被锁定。我制作了这个,但我担心它会做什么:
bool DataCache::isLocked() const {
bool res = lock_->try_lock();
if(res)
lock_->unlock();
return res;
}
这是个好主意吗?有没有办法检查它而不锁定它?
答案 0 :(得分:8)
虽然另一个答案是不引入竞争条件的关键,但没有理由会降低使用正确的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
答案 1 :(得分:0)
因为这不适合评论:您可以在外部为tryLock
和unlock
创建“界面功能”。
e.g:
bool DataCache::try_lock() const {
return lock_->try_lock();
}
void DataCache::unlock() const {
lock_->unlock();
}
用法:
DataCache cache;
if(cache.try_lock())
{
cache.doSomething();
cache.unlock();
}
else
{
//....
}
我不确定const
是否适用于此处。我只是从问题代码中复制了它。