Реализация метода перезагрузки в 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;

} `

0 ответов

Другие вопросы по тегам