Я использую Visual Studio и я получаю исключение на следующей строке кода повышение :: shared_ptr:Многопоточность ошибки в повышение :: shared_ptr код
void release() // nothrow
{
if(BOOST_INTERLOCKED_DECREMENT(&use_count_) == 0)
{
dispose();
weak_release();
}
}
Я думаю, что это многопоточность, потому что это очень случайный, когда это происходит. Я пытаюсь получить более подробную информацию.
Я разделяю unordered_map<std::string, boost::shared_ptr<MyClass>>
среди нескольких тем. Я думаю, что ошибка связана с тем, что разные потоки обращаются к unordered_map в одно и то же время (потоки не имеют доступа к тем же элементам unordered_map).
MyClass содержит unordered_map и набор. Нити добавляют числа к этим структурам данных. Так что если у меня было:
class MyClass{
public:
void addToMap(double a, long b);
void addToSet(double c);
private:
unordered_map<double, long> a;
set<double> b;
}
- резьбы 1: Процессы элемент 1
std::unordered_map<std::string, boost::shared_ptr<MyClass> >
- резьбы 2: Процессы элемент 2
std::unordered_map<std::string, boost::shared_ptr<MyClass> >
- резьбы 3: Процессы элемент 3
std::unordered_map<std::string, boost::shared_ptr<MyClass> >
- резьбы 4: обрабатывает элемент 4 из
std::unordered_map<std::string, boost::shared_ptr<MyClass> >
У меня нет замков в м y код. Может кто-нибудь, пожалуйста, сообщите, как я могу потенциально решить эту проблему (даже если это означает, что код будет медленнее)? Нужно ли просто вставлять мьютексы внутри каждого объекта MyClass? Однако, похоже, это boost :: shared_ptr объекта MyClass, вызывающего исключение?
Я не передаю никаких boost::shared_ptr
объектов по ссылке/указателю.
Объясните, как связаны два фрагмента кода? – Ajay
Вы опубликовали код, в котором функция shared_ptr генерирует исключение, и все же код, который вы опубликовали, не содержит объектов shared_ptr. Это затруднит диагностику. –
@ AndyNewman все, что я вижу, это Visual Studio, ломающееся над этой строкой в заголовке boost_ptr boost. – user997112