2012-02-14 7 views
0

クラスのctorでstd :: threadを初期化する必要があります。スレッドは、クラス自体のメンバ関数を実行する必要があります。スレッドで初期化しようとすると、プログラムはメンバ関数を実行しようとします。 (移動意味が実装されています)。可動クラスのctorでstd :: threadを初期化する

Page::Page(Motion *_parent): 
    parent(_parent) 
{ 
    std::thread x(&Page::play,this); 
    starter = std::move(x); 
} 

プログラムはthisplay()を実行します!それはやっての標準的な方法だ場合、私は、今、私はstd::bindで遊んだ...

void Page::start() 
{ 
    std::thread x(&Page::play,this); 
    x.join(); 
} 

をと正常に動作しますが、それはOKだかどうかわからない:

EDIT:私はこれを行いますコードを置き換えます。

#include <iostream> 
#include <thread> 
#include <functional> 

struct Foo 
{ 
    Foo() 
     : thread(std::bind(Foo::bar, this))   
     { } 

    ~Foo() 
     { thread.join(); } 

    static void bar(Foo *foo) 
     { } 

    std::thread thread; 
}; 

int main() 
{ 
    Foo foo; 
} 
+1

私はあなたの質問が得られません。 – kukyakya

+0

@kukyakya:問題はctorの最初の行にあり、プログラムは 'this-> play()'を実行します。 –

+0

@ジョアヒム:私はそれを理解することはできません... –

答えて

2

std::threadのコンストラクタが自動的にすぐにスレッドを開始し、新しいスレッドはその後、供給関数を呼び出し、その

std::thread x(&Page::play,this); 

が自動的this->play()を呼び出します。このような何かについてどのように

+0

"std :: threadに"遅延開始 "機能はありません。実際にyieldを使用して、スレッドの開始時を制御することができます。 – user18490

+0

Yieldは、スレッドの開始時点を制御しません。 'std :: promise'や' std :: future'や 'std :: condition_variable'や' std :: atomic 'フラグのようなシグナリングメカニズムを使うと、新しいスレッドのコードが実行されますが、スレッド自体が開始されるタイミングは制御できません。 –

+0

は直接的ではありませんが、間接的にはhttp://www.cplusplusなどです。com/reference/thread/this_thread/yield/ – user18490

1

新しいスレッドで。

これは、Start()メンバ関数を呼び出して明示的にスレッドを開始する必要があるいくつかのスレッドライブラリ(.Netなど)とは異なります。 std::threadの「遅延開始」施設はありません。

他の関数を呼び出すまでスレッドを実際に起動したくない場合は、コンストラクタ内のstd::threadオブジェクトを初期化しないで、代わりにstart()関数で行います。

スレッドオブジェクトでjoin()を呼び出した場合、コードはjoin()の呼び出しでスレッドが完了するまで待機します。したがって、start()関数のようにスレッドオブジェクトを作成した直後に結合を実行すると、play()を直接呼び出すことができます。start()はスレッドが完了するまで戻りません。

std::bindstd::threadを必要としません。スレッドコンストラクタはバインディングを自動的に処理します。