Мне понадобится помощь в решении сегодняшней загадки многопоточности.
У меня есть приложение с посредником, скажем:
class Mediator{
ConfigMgr * mgr;
....
Config getConfig(){
return mgr->getConfig();
};
};
ConfigMgr правильно инициализирован, с ним проблем нет. Он состоит, среди прочего, из схемы конфигурации, которая представляет собой структуру с некоторыми логическими значениями и std::strings:
struct Config{
std::string param1;
std::string param2;
....
}
class ConfigMgr {
Config blueprint;
Config getConfig(){
Lock l(mtx); //wrapper on POSIX mutex and lock, works as expected
refreshConfig(); // some stuff that might alter Config blueprint
return config;
}
}
Наконец, у меня есть несколько рабочих потоков, которым время от времени может понадобиться вызвать mediator->getConfig().param1;
.
Проблема в том, что время от времени мое приложение вылетает из-за SIGABRT. Из того, что я смог определить, происходит сбой при двойном удалении строки в деструкторе Config: Config::~Config()
В структуре нет написанных мной методов.
Я не могу отследить первопричину. Моя структура конфигурации всегда передается копией, а не ссылкой. Я думаю, что каждый поток должен иметь свою собственную копию Config с момента вызова ConfigMgr::getConfig(). Эта конструкция должна быть потокобезопасной, но явно существует какое-то состояние гонки. У вас есть какие-нибудь советы?
ConfigMgr
, владеющий объектомConfig
, удаляется дважды? - person Ben Voigt   schedule 18.12.2012getConfig
единственным API из ваших рабочих потоков дляConfigMgr
? - person SomeWittyUsername   schedule 18.12.2012