Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中实现重载方法+;储蓄服务器_C++_Multithreading_Thrift - Fatal编程技术网

C++ 在C+中实现重载方法+;储蓄服务器

C++ 在C+中实现重载方法+;储蓄服务器,c++,multithreading,thrift,C++,Multithreading,Thrift,我使用Apache节约框架,我正在编写一个应用程序,它有C++服务器和Python客户端。应用程序有一个很大的资源对象,在生命周期中使用。我的应用程序需要有一个重载方法。它应该删除所有资源,并从磁盘加载新实例。我编写了清理方法,并在加载方法之前调用它。如果我使用TSimpleServer(单线程),这就是工作。但当我开始使用ThreadedServer或TNonBlocking server(多线程)时,cleannig方法不起作用,正如我所看到的,它正在调用,但它不清理。服务器刚刚开始使用两倍

我使用Apache节约框架,我正在编写一个应用程序,它有C++服务器和Python客户端。应用程序有一个很大的资源对象,在生命周期中使用。我的应用程序需要有一个重载方法。它应该删除所有资源,并从磁盘加载新实例。我编写了清理方法,并在加载方法之前调用它。如果我使用TSimpleServer(单线程),这就是工作。但当我开始使用ThreadedServer或TNonBlocking server(多线程)时,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;
};
模板
无效删除处理器(T和处理器){
for(typename T::iterator iter=processor.begin();iter!=processor.end();++iter){
删除iter->second;
}
处理器。清除();
}
类taggerHandler:虚拟公共taggerIf{
公众:
taggerHandler(){
这->加载资源();
}
void tagText(std::string&_返回,const std::string&text,const std::string&language){
//有用函数
}
无效重新加载(标准::字符串和返回,常量标准::字符串和参数){
这->clearResources();
这->加载资源();
}
私人:
void loadResources(){
//这里是配置读取、选项声明等。。
//maco只是来自freeling库的对象,可以分配>100MB
字符串语言=“en”;
this->macoProcs[language]=shared_ptr(new maco());
}
void clear资源(){
macoProcs.clear();
//这种方式是在共享之前
//删除处理器(macoProcs);
}
mapoprocs;
//这种方式是在共享之前
//mapoprocs;
};
节俭初始化:

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;
int main(int argc,char**argv){
共享的ptr处理程序(新的taggerHandler());
共享ptr处理器(新标记处理器(处理程序));
共享的ptr服务器传输(新的TServerSocket(端口));
共享的ptr传输工厂(新的TBufferedTransportFactory());
共享的ptr协议工厂(新的TBinaryProtocolFactory());
shared_ptr threadManager=threadManager::newSimpleThreadManager(15);
shared_ptr threadFactory=shared_ptr(新的PosixThreadFactory());
threadManager->threadFactory(threadFactory);
threadManager->start();
//TSimpleServer服务器(处理器、服务器传输、传输工厂、协议工厂);
TNonblockingServer服务器(处理器、协议工厂、端口、线程管理器);
server.service();
返回0;

}`

(1)能否添加Thrift server协议栈设置?(2) 您是否检查了
maco
dt或get的调用,并在
macoProcs.clear()
?Aded Thrift stack ini上正确执行。至于清晰的方法:当我使用原始PTR时,我很确定,因为它很容易检查
delete
操作符。现在我确信这只是因为它在单线程模式下工作。用互斥锁或类似的东西保护每个入口点应该对你有帮助,我同意这一点。如果没有帮助,那么可能是FreeLing源代码中有某种东西阻止(至少)在MT环境中使用此部件。-编辑:页面状态为“FreeLing 3.1是线程安全的,允许并行处理(例如在Web服务中)。”您的意思是将互斥体放在写方法上,例如重新加载,还是将互斥体放在
tagText
(只读取的有用方法)上?如果首先,我在使用原始PTR时已经尝试过了。要么是您做错了(我认为不是这样,但根据上面显示的代码,我无法确定),要么是您的库版本不完全支持这一点。因为我不是一个弗里林专家,这只是受过教育的猜测,但很可能这不是一个节俭的问题。