2010-12-01 10 views
2

スレッドとバインドのやりとりに関して少し問題があります。C++バインドを使用してスレッドを作成する際の問題

それは簡単です、私はうまく今ではすべてが大丈夫ですまで

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; 
    //... 
}; 

OK、このような状況を持っています。バインドは、ある関数または関数へのポインタを、いくつかの値以上、いくつかの引数値にバインドできることを理解しています。 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 
} 

まあ、私は別のスレッドをexecしたいです。 最初の質問:shared_prtはスマートなポインタです。つまり、dosome()がexecフローから抜け出すと、そのスコープから実行されたスレッドは、shared_ptrになります。 2番目の質問:コンパイラは、行Xの命令のために本当に怒っています... 問題はバインドです、それはおそらく私がそこを通過したものが好きではありません...なぜですか?これはメンバー関数です(私はdoanotherについて話します)、これに2つの引数があります。 どこに問題がありますか?

は、ブーストのためにあなたに

+0

コードを選択してCtrl + Kキーを押してコードをフォーマットしてください。プレビューを使用します。 – EboMike

答えて

4
  1. ...パラメータが続くメンバ関数とそのオブジェクトへのポインタを取ります。または、bindのように考えると、something->your_member()のようなメンバー関数を呼び出す必要がありますので、somethingが何であるか教えてください。

  2. 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は、バインドする2番目のパラメータとして渡す必要があります。

+0

はい、今動作します。ありがとうございました。 – Andry

2

をありがとう::バインド 'はこの' は、第1のパラメータである(というかMyClassのの最初のパラメータ:: doanother 'はこの' です):

boost::bind(&myclass::doanother, this, m, x) 

理由実行時にパラメータ をバインドします。関数dosomeが のパラメータを使用していない場合は、これを実行しますか?

すべてのクラスメソッドに 'this'という最初のパラメータがあります。入力する必要はありません。コンパイラは自動的にそれを追加します。クラスの各インスタンスは同じコードを使用しますが、それ自身のメンバ変数を持ちます。 'this'パラメータは、メソッドによって使用されるメンバ変数へのポインタです。

あなたは本当に別のスレッドでこれにバインドしたいですか?つまり、複数のスレッドが同じインスタンスのメンバ変数にアクセスできますが、これは実行可能ですが、おそらく私がやる方法ではありません。

0

は、まあ、私は別のスレッドをexecしたい

...の部分に答えるようにしてください。 最初の質問:shared_prtは、これがあればdosome() が が、これは私に教えてください... shared_ptrのもの、それはそのスコープ から実行 スレッドが持続します、その幹部の流れから取得することを意味し、スマート ポインタであります正しい。

なし。このオブジェクトへの他の参照はないので、shared_ptrが有効範囲外になると、スレッドオブジェクトが削除され、すべての種類のクラップが発生する可能性があります。

第二に、boost::bindはあなたが暗黙のパラメータとして考えることができ

関連する問題