2011-07-09 15 views
-1

ブーストスレッドは、引数が静的でなければならないメンバ関数を必要とするようです。それが静的でない場合はバインド方法がありますが、私はオブジェクトoを好む。 o.startThread()よりも オブジェクトo; boost :: thread(boost :: bind ....)スレッドコードをクラス内に保持するため(例外処理も) だから、たとえば、これは仕事に書き換えることができます。他のメンバ関数から非スタティックメンバ関数のブーストスレッドを起動することは可能ですか?

class sayHello 
{ 
    string name; 
public: 
    sayHello(string name_):name(name_) 
    { 
    } 
    void repeatHello() 
    { 
     while (true) 
     { 
      boost::this_thread::sleep(posix_time::seconds(3)); 
      cout<<"Hello "<<name<<endl; 
     } 
    } 
    void infiniteRun() 
    { 
     boost::thread thr(repeatHello);//broken line 
    } 
}; 

P.S.人々は「バインド方法」であるものを放浪するために私の知る限り、それはこれです:

sayHello sh("world"); 
boost::thread thr(boost::bind(&sayHello::repeatHello,&sh)); 

答えて

1

はい...

void infiniteRun() 
{ 
    boost::thread thr(boost::bind(&sayHello::repeatHello,this)); 
} 

それメモリリークやアクセス違反の危険性をはらんでそのようにやってますが。スレッドを扱うときは、スマートポインタを使って物事を正しく生かしておくことを強くお勧めします。

+0

どのようにメモリリークが発生する可能性が高く、違反にもアクセスしない可能性があります。デストラクタが最初に行うことはスレッドを停止することですが、何が危害ですか? –

+0

@ジョン:はい、すべてを完全にコーディングすると、何も壊れません。しかし、すべてが完全にコーディングされるわけではありませんそういうわけで、スマートポインターは良い考えです。彼らはメモリが確実に周囲にあることを保証するからです。 –

+0

私はスマートポインタが何であるか知っています。私は彼らがここであなたに勝つものを見ていない。 –

関連する問題