Реализация метода перезагрузки в C++ Thrift Server
Я использую платформу Apache Thrift, я пишу приложение, которое имеет сервер C++ и клиент Python. Приложение имеет большой ресурсный объект, который используется при жизни. Мое приложение должно иметь метод перезагрузки. Следует удалить все ресурсы и загрузить новые экземпляры с диска. Я написал метод очистки и вызвал его перед загрузкой метода. Это работа, если я использую TSimpleServer(однопоточный). Но когда я начинаю использовать сервер ThreadedServer или TNonBlocking (многопоточный), метод cleannig не работает, как я вижу, он вызывает, но не очищает. Сервер только начинает использовать вдвое больше памяти. Я пытался использовать мьютекс во время очистки, но это не помогло. Мне кажется, что дело в многопоточности, удаленные методы запускаются в дочернем потоке, поэтому они не могут высвобождать ресурсы, выделенные в основном потоке.
template<typename T>
void deleteProcessors(T &processor) {
for (typename T::iterator iter = processor.begin(); iter != processor.end(); ++iter) {
delete iter->second;
}
processor.clear();
}
class taggerHandler : virtual public taggerIf {
public:
taggerHandler() {
this->loadResources();
}
void tagText(std::string& _return, const std::string& text, const std::string& language) {
//useful function
}
void reload(std::string& _return, const std::string& parmeters) {
this->clearResources();
this->loadResources();
}
private:
void loadResources() {
//here config reading, option declaring etc..
//maco just object from freeling library, could allocate >100MB
string language = "en";
this->macoProcs[language] = shared_ptr<maco>(new maco());
}
void clearResources(){
macoProcs.clear();
//this way was before shared_ptr
//deleteProcessors(macoProcs);
}
map<string, shared_ptr<maco> > macoProcs;
//this way was before shared_ptr
//map<string, maco*> macoProcs;
};
Экономия инициализации:
int main(int argc, char **argv) {
shared_ptr<taggerHandler> handler(new taggerHandler());
shared_ptr<TProcessor> processor(new taggerProcessor(handler));
shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
shared_ptr<ThreadManager> threadManager = ThreadManager::newSimpleThreadManager(15);
shared_ptr<PosixThreadFactory> threadFactory = shared_ptr<PosixThreadFactory>(new PosixThreadFactory());
threadManager->threadFactory(threadFactory);
threadManager->start();
//TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
TNonblockingServer server(processor, protocolFactory, port, threadManager);
server.serve();
return 0;
} `