我想知道最好的方式来启动一个C ++类的成员吗?我自己的方法作为答案......
答案 0 :(得分:23)
这可以通过使用boost库来完成,如下所示:
#include <boost/thread.hpp>
// define class to model or control a particular kind of widget
class cWidget
{
public:
void Run();
}
// construct an instance of the widget modeller or controller
cWidget theWidget;
// start new thread by invoking method run on theWidget instance
boost::thread* pThread = new boost::thread(
&cWidget::Run, // pointer to member function to execute in thread
&theWidget); // pointer to instance of class
注意:
在C ++ 11中,你可以做同样的事情,但没有提升
// define class to model or control a particular kind of widget
class cWidget
{
public:
void Run();
}
// construct an instance of the widget modeller or controller
cWidget theWidget;
// start new thread by invoking method run on theWidget instance
std::thread * pThread = new std::thread(
&cWidget::Run, // pointer to member function to execute in thread
&theWidget); // pointer to instance of class
答案 1 :(得分:15)
我通常使用类的静态成员函数,并使用指向该类的指针作为void *参数。然后,该函数可以执行线程处理,或者使用类引用调用另一个非静态成员函数。然后,该函数可以引用所有类成员而不会出现笨拙的语法。
答案 2 :(得分:11)
你必须使用void *参数来引导它:
class A { static void* StaticThreadProc(void *arg) { return reinterpret_cast<A*>(arg)->ThreadProc(); } void* ThreadProc(void) { // do stuff } }; ... pthread_t theThread; pthread_create(&theThread, NULL, &A::StaticThreadProc, this);
答案 3 :(得分:3)
我使用了上面列出的三种方法。 当我第一次在c ++中使用线程时,我使用了静态成员函数,然后是朋友函数,最后是 BOOST库。目前我更喜欢BOOST。在过去的几年里,我已经成为了BOOST的重要人物。
BOOST是C ++,因为CPAN是Perl。 :)
答案 4 :(得分:0)
boost库提供了一种复制机制,有助于传输对象信息 到新线程。在另一个boost示例中,boost :: bind将使用指针复制,该指针也只是被复制。因此,您必须注意对象的有效性,以防止悬空指针。如果实现operator()并提供复制构造函数并直接传递对象,则不必关心它。
一个更好的解决方案,可以避免很多麻烦:
#include <boost/thread.hpp>
class MyClass {
public:
MyClass(int i);
MyClass(const MyClass& myClass); // Copy-Constructor
void operator()() const; // entry point for the new thread
virtual void doSomething(); // Now you can use virtual functions
private:
int i; // and also fields very easily
};
MyClass clazz(1);
// Passing the object directly will create a copy internally
// Now you don't have to worry about the validity of the clazz object above
// after starting the other thread
// The operator() will be executed for the new thread.
boost::thread thread(clazz); // create the object on the stack
另一个boost示例在堆上创建线程对象,尽管没有意义。