【发布时间】:2012-06-14 11:27:03
【问题描述】:
我需要在 C++ 类中嵌入一个线程,这是一种活动对象,但不完全是。我正在从类的构造函数中生成线程,这样做可以吗?这种方法有什么问题吗?
#include <iostream>
#include <thread>
#include <unistd.h>
class xfer
{
int i;
std::shared_ptr<std::thread> thr;
struct runnable {
friend class xfer;
void operator()(xfer *x) {
std::cerr<<"thread started, xfer.i:"<<x->i;
}
} run;
public:
xfer() try : i(100), thr(new std::thread(std::bind(run, this))) { } catch(...) { }
~xfer() { thr->join(); }
};
int
main(int ac, char **av)
{
xfer x1;
return 0;
}
【问题讨论】:
-
friend class xfer没有做你认为的事情:它声明xfer是friend的runnable(没用)而不是runnable是 @987654327 @ ofxfer(我猜这是你的意图)。 -
将 runnable 声明为 xfer 的朋友的目的是访问 xfer 的私有状态和 operator()() 函数的类型,以像 xfer 类的方法一样工作。没有办法将成员函数传递给线程。因此声明。
-
我已经声明了您建议的方式,它也具有相同的效果。谢谢
-
@RavikumarTulugu:
runnnable是xfer的内部类,因此它已经可以访问内部。那里不需要友谊。 -
我试过这样做,但似乎只有在外部类的成员变量是静态的情况下才有效。
标签: c++ multithreading c++11 stdthread