C ++使用指向std :: shared_ptr的Raw指针

问题描述 投票:1回答:1

所以我试图通过我正在使用的消息传递机制在线程之间传递共享指针。由于序列化/反序列化的工作方式,我无法直接将shared_ptr嵌入到发送的消息中。因此,我实际上需要发送一个shared_ptr的原始指针。见下文:

线程1:

auto objPtr = std::make_shared<ObjectClass>();
uint64_t serializedPtr = reinterpret_cast<uint64_t>(&objPtr);

线程2:

std::shared_ptr<ObjectClass> objPtrT2 = *(reinterpret_cast<std::shared_ptr<ObjectClass>*>(serializedPtr));

这在增加共享指针的引用计数时有时会在线程2中崩溃。我只能假设某些比赛条件在这里发挥作用,但还无法找出解决方案。请注意,它并不总是崩溃,反序列化似乎总是成功的。

我是否需要同步访问此shared_ptr(shared_ptr本身,而不是share_ptr指向的内容)?我担心我传输此shared_ptr的方式破坏了引用计数的管理方式。

我仍在争论是否出于其他与性能相关的原因而使用了shared_ptr,但我想知道出于自己的利益我在做错什么。

谢谢

c++ multithreading thread-safety shared-ptr race-condition
1个回答
0
投票

无法执行此操作。不管您使用什么序列化/反序列化机制,它都会以允许目标连接到源拥有的对象的方式正确地对管理对象引用计数的内部块进行序列化。除此之外,两个不同的shared_ptr实例无法互通;他们无法正确管理同一资源。充其量,通过shared_ptr的尝试与此等效:

shared_ptr<T> ptr1 = ...; shared_ptr<T> ptr2(ptr1.get());

这不起作用。最坏的情况是,您正在创建功能障碍的对象。

唯一的解决方案是获得更好的消息传递系统,该系统能够传递

实时C ++对象

,而不仅仅是传递原始位。更具体地说,用于在进程甚至计算机之间传输数据的管道具有一定的局限性,即不必用于在threads之间传输对象的管道。跨进程和计算机的shared_ptr是没有意义的(嗯,这个主意很好,只是不会被拼写为std::shared_ptr)。
© www.soinside.com 2019 - 2024. All rights reserved.