我有一些关于线程和绑定交互的问题。
很简单,我有这种情况
class myclass {
// ...
// ...
void dosome();
void doanother(myclass2, myclass3*);
void run() {
this->_myt = boost::shared_ptr<boost::thread>(
new boost::thread(boost::bind(&myclass::dosome, this)));
}
// ...
boost::shared_ptr<boost::thread> _myt;
//...
};
好的,到现在为止一切都还好。我知道bind能够将函数或指向函数的指针绑定到某些值,或者更好地绑定一些参数值。 当我调用myclass对象时,函数run()启动一个新线程。我有一个问题,为什么在运行时绑定参数,当函数dosome不使用任何参数?是因为对于类函数,总是有一个隐式参数,它是指向类???
的指针好的,这不是我唯一的问题。 在dosome里面,这是我第一个线程的执行流程,我这样做:
void myclass::dosome() {
myclass2 m;
myclass3* x = new myclass3;
boost::shared_ptr<boost::thread>(new boost::thread(
boost::bind(&myclass::doanother, m, x, this))); // Line X
}
我想要执行另一个线程。 第一个问题:shared_prt是一个智能指针,这意味着如果dosome()从其exec流中退出,它从该作用域执行的线程将持续存在,作为shared_ptr ...请告诉我这是正确的。 第二个问题:编译器对第X行的指令非常生气... 问题是绑定,它可能不喜欢我通过那里...为什么?这是一个成员函数(我说的是另一个),有两个参数加上这个...... 问题在哪里?
谢谢
答案 0 :(得分:4)
您可以将其视为隐式参数。或者您可以将此视为bind
需要调用您的成员函数something->your_member()
,因此您必须告诉它something
是什么。
在第二个示例中,您不会将shared_ptr
存储在任何位置,因此它会在创建后立即销毁。它指向的线程对象也将被销毁。但是线程的执行本身并没有绑定到线程对象,所以这将以完全相同的方式工作:
void myclass::dosome() {
myclass2 m;
myclass3* x = new myclass3;
boost::thread(boost::bind(&myclass::doanother, this, m, x)); // Line X
}
这会启动一个新线程并将其丢失,就像在代码中一样。线程继续运行。
如上所述,this
应作为要绑定的第二个参数传递。
答案 1 :(得分:2)
对于boost :: bind'这个'是第一个参数(或者更确切地说是myclass :: doanother的第一个参数是'this'):
boost::bind(&myclass::doanother, this, m, x)
为什么在运行中绑定参数 这个,当函数dosome没有 使用任何参数?
所有类方法都有一个'this'的第一个参数,我们永远不必输入它,编译器会自动添加它。类的每个实例使用相同的代码,但具有自己的成员变量。 'this'参数是指向方法使用的成员变量的指针。
你真的想在另一个线程中绑定到这个吗?这意味着多个线程可以访问同一实例的成员变量,这些变量是可行的,但可能不是我的方式。
答案 2 :(得分:0)
尝试部分回答..
我想要执行另一个线程。 第一个问题:shared_prt很聪明 指针,这意味着如果dosome() 从它的exec流出来了 线程从该范围执行 将继续存在,成为一个共享点... 请告诉我这是对的。
NO。没有其他对此对象的引用,因此当shared_ptr超出范围时,线程对象将被删除,并且可能发生各种废话......
其次,boost::bind
将指针指向成员函数,然后是对象,后跟参数...