草庐IT

Shared_ptr

全部标签

c++ - scoped_lock 可以在读取模式下锁定 shared_mutex 吗?

C++17引入了std::shared_mutex和std::scoped_lock。我现在的问题是,当它作为参数传递时,scoped_lock将始终以独占(写入器)模式锁定共享互斥锁,而不是在共享(读取器)模式下。在我的应用程序中,我需要使用来自对象src的数据更新对象dst。我想锁定src共享和dst独占。不幸的是,如果同时调用另一个带有src和dst切换的更新方法,这可能会导致死锁。所以我想使用std::scoped_lock的花哨的死锁避免机制。我可以使用scoped_lock在独占模式下同时锁定src和dst,但是这种不必要的严格锁定会在其他地方产生性能回退。但是,似乎可以将

c++ - 提升 : recursive shared_mutex?

似乎Boost的shared_mutex是非递归的..周围有吗?(没有重新实现整个东西) 最佳答案 看看thisthread这个excellentexplanation为什么shared_mutex通常是个坏主意。因此,如果您不同意recursive_mutex也是个坏主意,请在没有任何shareiness的情况下使用它,因为它不会给您带来任何性能提升。您将收到更简洁的代码,无需任何重大更改。当许多线程经常读取数据而很少修改数据时,我尝试在我的项目中使用shared_mutex来锁定竞争激烈的map。收到了更差的性能结果

c++ - shared_ptr & weak_ptr 转换

我正在尝试使用std::shared_ptr和std::weak_ptr来处理对象。场景是这样的:我有channel类的对象,它派生自抽象类abstract::channel(带有纯虚函数)。我有一个容器channelContainer(std::vector)包含到channel的共享指针(std::shared_ptr)对象。现在,我有一个deque(std::deque)包含指向channelContainer(std::weak_ptr)/。让我们将此双端队列命名为freeChannelQueue。可以这么说:std::vector>channelContainer;std::

c++ - 使用weak_ptr的观察者模式

我正在尝试从observerpattern编写一个安全的Subject类.我想知道使用weak_ptr是否是存储IObserver实例的最佳方式:IObserver实例在释放后无法使用。Subject类不保留应该释放的IObserver引用(lapsedlistenerproblem)。Subject类必须是线程安全的。很遗憾,我们的编码标准规定我们不允许使用boost。我想我前世是个坏人。幸运的是,我可以使用C++11(VisualStudio2012附带的)。这是一个示例Observer类。//Observerinterfacethatsupportsnotify()methodc

c++ - 如何正确复制给定其 shared_ptr 的对象

我正在尝试复制自定义类Event的对象。我有一个指向我从其分配中获得的对象的共享指针:std::shared_ptre=std::make_shared();为了得到e的真实拷贝(不仅仅是指针的拷贝),我尝试过:std::shared_ptro=std::make_shared(*e);但我不确定这是否是正确的方法,因为似乎如果我删除e它也会删除o...顺便说一句,我还没有定义复制构造函数Event::Event(constEvent&orig)但据我了解,这不是必需的,因为编译器提供了默认的复制构造函数。事件类只包含变量,没有进一步的指针。 最佳答案

c++ - 为什么 asm 中的这种差异对性能很重要(在未优化的 ptr++ 与++ptr 循环中)?

TL;博士:第一个循环在HaswellCPU上运行速度提高了约18%。为什么?循环来自gcc-O0(未优化)循环使用ptr++对比++ptr,但问题是为什么生成的asm表现不同,而不是关于如何编写更好的C。假设我们有这两个循环:movl$0,-48(%ebp)//Loopcountersetto0movl$_data,-12(%ebp)//Pointertothedataarraymovl%eax,-96(%ebp)movl%edx,-92(%ebp)jmpL21L22://ptr++movl-12(%ebp),%eax//Getthecurrentaddressleal4(%eax)

c++ - 为什么构造不完整类型的 std::unique_ptr 编译?

代码:#includestructData;std::unique_ptrmake_me();intmain(){std::unique_ptrm=make_me();return0;}当然失败了:Infileincludedfrom:1:Infileincludedfrom/opt/compiler-explorer/gcc-7.1.0/lib/gcc/x86_64-linux-gnu/7.1.0/../../../../include/c++/7.1.0/memory:80:/opt/compiler-explorer/gcc-7.1.0/include/c++/7.1.0/bit

c++ - 构造对象时有什么理由不使用 std::make_shared 吗?

我想不出任何情况std::shared_ptrobj(newObject("foo",1));会更喜欢autoobj=std::make_shared("foo",1);后者总是会产生更好的局部性并减少内存碎片。除了与返回原始指针的代码接口(interface)之外,是否有任何情况下您更愿意(或被迫)使用第一种形式? 最佳答案 Thelatteralwaysresultsinbetterlocalityandreducesmemoryfragmentation.不总是。鼓励实现对引用计数的对象和引用计数使用单个分配,但这不是必需这样

c++ - Unique_ptr 和前向声明

假设我有两个类(class):“Foo.h”#pragmaonceclassFoo{public:Foo(){};~Foo(){};};“啊”#pragmaonce#includeclassFoo;classA{public:A(){};~A(){};std::unique_ptrfoo;};A持有Foo的unique_ptr。我不想在“A.h”中包含Foo,所以我转发了它。通过在“A.h”中向前声明类Foo,我得到一个编译时错误:errorC2027:useofundefinedtype'Foo'errorC2338:can'tdeleteanincompletetype所以我关注了

c++ - 取消引用临时的 unique_ptr

unique_ptrmyFun(){unique_ptrpa(newA());returnpa;}constA&rA=*myFun();此代码可以编译,但rA包含垃圾。有人可以向我解释为什么这段代码无效吗?注意:如果我在取消引用之前将myFun的返回值分配给命名的unique_ptr变量,它可以正常工作。 最佳答案 unique_ptr会将所有权传递给另一个unique_ptr,但在您的代码中,没有任何内容可以从返回的指针中捕获所有权。换句话说,它不能转移所有权,所以它会被销毁。正确的做法是:unique_ptrrA=myFun()