Linux 如何使用boost使类成员函数成为线程函数
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6709793/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to make class member function as thread function using boost
提问by Peiti Li
I am going to write an adapter class. In this class there is an xmlrpc-c server (abyss server). I want to start the server by creating a new thread, and the thread's function is the member function XMLThreadFun()
.
我要写一个适配器类。在这个类中有一个 xmlrpc-c 服务器(abyss 服务器)。我想通过创建一个新线程来启动服务器,该线程的功能是成员函数XMLThreadFun()
。
When I try to use the code below there is an error at the line of the adapter's constructor implementation:
当我尝试使用下面的代码时,适配器的构造函数实现行出现错误:
/usr/include/boost/bind/bind.hpp:69:37: error: ‘void (Adapter::*)()' is not a class, struct, or union type
Can anyone tell me how to solve this error, or how to achieve my goal? I really appreciate it.
谁能告诉我如何解决这个错误,或者如何实现我的目标?对此,我真的非常感激。
Below is my code snippet:
下面是我的代码片段:
#ifdef _MSC_VER
#pragma warning( disable : 4503 4355 4786 )
#else
#include "config.h"
#endif
#include "quickfix/FileStore.h"
#include "quickfix/SocketInitiator.h"
#include "quickfix/SessionSettings.h"
#include "Application.h"
#include <string>
#include <iostream>
#include <fstream>
#include "quickfix/SessionID.h"
#include "quickfix/Session.h"
#include "getopt-repl.h"
#include <cassert>
#include <xmlrpc-c/base.hpp>
#include <xmlrpc-c/registry.hpp>
#include <xmlrpc-c/server_abyss.hpp>
#include <boost/thread.hpp>
#include <boost/date_time.hpp>
using namespace std;
class theClient : public xmlrpc_c::method {
public:
theClient() {}
theClient(FIX::SocketInitiator* initiator) {
set<FIX::SessionID> s(initiator->getSessions());
set<FIX::SessionID>::iterator myIterator;
for (myIterator = s.begin(); myIterator != s.end(); myIterator++) {
string str(myIterator->getSenderCompID());
clientname = str;
}
}
void execute(xmlrpc_c::paramList const& paramList,
xmlrpc_c::value * const retvalP) {
*retvalP = xmlrpc_c::value_string(clientname);
}
private:
string clientname;
};
class Adapter {
private:
xmlrpc_c::registry myRegistry;
xmlrpc_c::methodPtr XMLRPCMethodP;
xmlrpc_c::serverAbyss webServer;
boost::thread webServerThread;
public:
void initWebServer(string rpcHost, string rpcPort);
void XMLThreadFun();
Adapter(string rpcHost, string rpcPort);
};
Adapter::Adapter(string rpcHost, string rpcPort) : myRegistry(), XMLRPCMethodP(new theClient), webServer(myRegistry, 8181, "/tmp/xmlrpc_log"), webServerThread(boost::bind(&Adapter::XMLThreadFun, this, &webServer))
{
initWebServer(rpcHost, rpcPort);
}
void Adapter::XMLThreadFun() {
webServer->run();
}
void Adapter::initWebServer(string rpcHost, string rpcPort) {
webServerThread.join();
}
采纳答案by Josh
You will need to use boost::bind to call a member function as a thread. Something like
您将需要使用 boost::bind 将成员函数作为线程调用。就像是
class MyClass {
public:
void Start();
void DoStuff( int limit );
};
MyClass foo;
boost::thread thread1( boost::bind( &MyClass::Start, &foo ) );
boost::thread thread2( boost::bind( &MyClass::DoStuff, &foo, 30 ) );
// threads do stuff here
thread1.join();
thread2.join();
Specifically here, it looks like you would change
具体在这里,看起来你会改变
webServerThread( boost::bind( &Adapter::XMLThreadFun, this, &webServer)
to
到
webServerThread( boost::bind( &Adapter::XMLThreadFun, this )
回答by dielor
No need to use boost::bind
无需使用 boost::bind
boost::thread thread2( boost::bind( &MyClass::DoStuff, &foo, 30 ) );
is equivalent to:
相当于:
boost::thread thread2( &MyClass::DoStuff, &foo, 30 );