我正在尝试在多线程场景中实现以下代码:
Get shared access to mutex
Read data structure
If necessary:
Get exclusive access to mutex
Update data structure
Release exclusive lock
Release shared lock
Run Code Online (Sandbox Code Playgroud)
Boost线程有一个shared_mutex专为多读者单作者模型设计的类.关于这个类,有几个stackoverflow问题.但是,我不确定它适合任何读者可能成为作家的情况.文件说明:
UpgradeLockable概念是SharedLockable概念的改进,允许可升级的所有权以及共享所有权和独占所有权.这是SharedLockable概念提供的多读取器/单写模型的扩展:单个 线程可以在其他人拥有共享所有权的同时具有可升级的所有权.
从单词"single"我怀疑只有一个线程可以持有可升级的锁.其他人只持有共享锁,无法升级到独占锁.
你知道boost::shared_lock在这种情况下是否有用(任何读者都可能成为作家),或者是否还有其他方法可以实现这一目标?
当我使用pimpl习语时,将所有方法定义放在类定义中是否是个好主意?例如:
// in A.h
class A {
class impl;
boost::scoped_ptr<impl> pimpl;
public:
A();
int foo();
}
// in A.cpp
class A::impl {
// method defined in class
int foo() {
return 42;
}
// as opposed to only declaring the method, and defining elsewhere:
float bar();
};
A::A() : pimpl(new impl) { }
int A::foo() {
return pimpl->foo();
}
Run Code Online (Sandbox Code Playgroud)
据我所知,将方法定义放在类定义中的唯一问题是(1)实现在包含类定义的文件中可见,(2)编译器可以使方法内联.
在这种情况下,这些不是问题,因为类是在私有文件中定义的,并且内联没有任何效果,因为只在一个地方调用方法.
将定义放在类中的优点是您不必重复方法签名.
那么,这样可以吗?还有其他问题需要注意吗?
读这个问题让我思考:对于给定的函数f,我们怎么知道这个形式的循环:
while (x > 2)
x = f(x)
Run Code Online (Sandbox Code Playgroud)
将停止任何价值x?有一些简单的标准吗?
(事实上,f(x) < x对于x > 2似乎并没有帮助,因为该系列可以会聚).
具体来说,我们可以证明这一点为sqrt和log?