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)
这是个好主意吗?有没有办法检查它而不锁定它?
而对方的回答是关键,没有引入竞争条件,有没有理由放弃异常安全以及来自使用正确的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)
#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)
| 归档时间: |
|
| 查看次数: |
1361 次 |
| 最近记录: |