try_lock()+unlock()是否是检查boost::interprocess::file_lock是否已锁定的
Is try_lock() +unlock() valid way to check whether boost::interprocess::file_lock is locked?
我需要检查文件是否使用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
因为这不适合注释:您可以从外部为tryLock
和unlock
创建"接口函数"。
例如:
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
是否能在这里工作。我刚刚从问题代码中复制了它。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 我们是否需要对多线程 x32 系统使用 lock 来读取或写入 uint32_t 变量
- 我是否必须使用neak_ptr.lock()只是为了测试它是否指向有效的对象
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- “std::mutex”和“std::lock”是否保证处理器间代码中的内存同步
- 尝试std::lock[_unique]和std::shared_mutex的线程是否会被调用std::lock_sha
- "lock-free"的含义是否由C++标准定义?
- std::lock_guard<std::mutex> lock(m) 是否有简写?
- 是否有任何惯用的显式使用mutex::lock()或unlock()