Итак, я пытаюсь передать общий указатель между потоками через механизм обмена сообщениями, который я использую. Из-за того, как работает сериализация / десериализация, я не могу напрямую встроить 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 при увеличении счетчика ссылок общего ресурса указатель. Я могу только предположить, что здесь участвуют некоторые условия гонки, но я не смог найти решение. Обратите внимание, что он не всегда обрабатывает sh, и десериализация, по-видимому, всегда успешна.
Нужно ли синхронизировать доступ к этому shared_ptr (самому shared_ptr, а не тому, на что указывает share_ptr)? Я обеспокоен тем, что способ, которым я передаю этот shared_ptr, нарушает способ управления счетчиком ссылок.
Я до сих пор спорю, подходит ли использование shared_ptr здесь по другим причинам, связанным с производительностью, но Я хотел бы знать, что я делаю неправильно для моей собственной выгоды.
Спасибо
РЕДАКТИРОВАТЬ: Просто отметить, что поток 1 и поток 2 находятся в одном процессе / хосте. Я включаю shared_ptr в карту, управляемую thread1 (я пытался опустить детали, которые я изначально считал неважными). Однако я не осознавал, что способ, которым я получаю данные с указанной карты, был неправильным. Я копировал содержимое карты во временный shared_ptr и затем отправлял адрес временного shared_ptr в thread2. Поэтому я невольно отправлял адрес переменной в стеке. Глупая ошибка, но я думаю, что комментарий в этой теме был довольно поучительным / полезным, тем не менее. Кажется, следующее исправляет мою проблему.
auto& objPtr = m_objMap[index];
uint64_t serializedPtr = reinterpret_cast<uint64_t>(&objPtr);