C ++使用Bind创建线程的问题

时间:2010-12-01 09:12:13

标签: c++ multithreading function-pointers bind

我有一些关于线程和绑定交互的问题。

很简单,我有这种情况

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行的指令非常生气... 问题是绑定,它可能不喜欢我通过那里...为什么?这是一个成员函数(我说的是另一个),有两个参数加上这个...... 问题在哪里?

谢谢

3 个答案:

答案 0 :(得分:4)

  1. 您可以将其视为隐式参数。或者您可以将此视为bind需要调用您的成员函数something->your_member(),因此您必须告诉它something是什么。

  2. 在第二个示例中,您不会将shared_ptr存储在任何位置,因此它会在创建后立即销毁。它指向的线程对象也将被销毁。但是线程的执行本身并没有绑定到线程对象,所以这将以完全相同的方式工作:

    void myclass::dosome() {
       myclass2 m;
       myclass3* x = new myclass3;
       boost::thread(boost::bind(&myclass::doanother, this, m, x)); // Line X
    }
    

    这会启动一个新线程并将其丢失,就像在代码中一样。线程继续运行。

  3. 如上所述,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将指针指向成员函数,然后是对象,后跟参数...