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

时间:2015-11-04 14:40:10

标签: c++ boost boost-interprocess

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

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

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

2 个答案:

答案 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)

因为这不适合评论:您可以在外部为tryLockunlock创建“界面功能”。

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是否适用于此处。我只是从问题代码中复制了它。