try_lock()+ unlock()是否有效检查boost :: interprocess :: file_lock是否被锁定?

Tom*_*ica 1 c++ boost boost-interprocess

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

bool DataCache::isLocked() const {
    bool res = lock_->try_lock();
    if(res)
        lock_->unlock();
    return res;
}
Run Code Online (Sandbox Code Playgroud)

这是个好主意吗?有没有办法检查它而不锁定它?

seh*_*ehe 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
Run Code Online (Sandbox Code Playgroud)

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

template <typename Lockable>
std::unique_lock<Lockable> try_to_lock(Lockable& lockable) {
    return std::unique_lock<Lockable> (lockable, std::try_to_lock);
}
Run Code Online (Sandbox Code Playgroud)

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

打印:

simple test
yes
no recursive lock
now we can lock again
Run Code Online (Sandbox Code Playgroud)

  • 作为RAII的+1应该是首选方式.我没有测试它,但是组合`std :: try_to_lock`中的`unique_lock`不应该在没有包装器的情况下完全相同吗?`if(auto lk = std :: unique_lock <std :: mutex>(mx,std :: try_to_lock)){...}`.如果`DataCache`提供函数`lock`,`unlock`和`try_lock`,这也应该有用 (2认同)