小编Amn*_*non的帖子

Boost中的多个读者,单个写入器锁

我正在尝试在多线程场景中实现以下代码:

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在这种情况下是否有用(任何读者都可能成为作家),或者是否还有其他方法可以实现这一目标?

c++ multithreading boost mutex

12
推荐指数
2
解决办法
1万
查看次数

将所有方法放在类定义中

当我使用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)编译器可以使方法内联.

在这种情况下,这些不是问题,因为类是在私有文件中定义的,并且内联没有任何效果,因为只在一个地方调用方法.

将定义放在类中的优点是您不必重复方法签名.

那么,这样可以吗?还有其他问题需要注意吗?

c++ pimpl-idiom inline

6
推荐指数
1
解决办法
219
查看次数

重复应用功能

这个问题让我思考:对于给定的函数f,我们怎么知道这个形式的循环:

while (x > 2)
   x = f(x)
Run Code Online (Sandbox Code Playgroud)

将停止任何价值x?有一些简单的标准吗?

(事实上,f(x) < x对于x > 2似乎并没有帮助,因为该系列可以会聚).

具体来说,我们可以证明这一点为sqrtlog

language-agnostic math

3
推荐指数
1
解决办法
202
查看次数