try_lock()+unlock()是否是检查boost::interprocess::file_lock是否已锁定的

Is try_lock() +unlock() valid way to check whether boost::interprocess::file_lock is locked?

本文关键字:lock 是否 锁定 file 检查 +unlock 是否是 try boost interprocess      更新时间:2023-10-16

我需要检查文件是否使用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 testn";
} // 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);
}

在Coliru上直播

#include <mutex>
#include <iostream>
int main() {
    // demo
    std::mutex mx;
    if (auto lk = try_to_lock(mx)) {
        std::cout << "simple testn";
    } // automatically unlocks at scope exit
    if (auto lk = try_to_lock(mx)) {
        std::cout << "yesn";
        if (auto lk = try_to_lock(mx)) {
            std::cout << "oops?!n"; // not reached
        } else {
            std::cout << "no recursive lockn";
        }
        // but you can manipulate the lock if you insist:
        lk.unlock();
        if (auto lk = try_to_lock(mx)) {
            std::cout << "now we can lock againn";
        } else {
            std::cout << "oops?!n"; // not reached
        }
    }
}

打印:

simple test
yes
no recursive lock
now we can lock again

因为这不适合注释:您可以从外部为tryLockunlock创建"接口函数"。

例如:

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是否能在这里工作。我刚刚从问题代码中复制了它。