2017-11-29 6 views
1

最近C++ 11スレッドを使用していて、何か(私にとっては奇妙なこと)に関する質問がありました。 クラス内でスレッドを開始できるメソッドを作成しました。スレッドの開始スレッドメソッドとコールバック関数は、クラスメソッドです。明確にするために 、私は私のPerson.cppファイルに:C++でのスレッド11クラスメンバーではない

void Person::callbackForThread(){ 
    ... 
} 


void Person::startThread(){ 
    this call threads. Something like: 
    thread(callbackForThread); 
} 

問題はC++ 11は私がクラスメソッドように、これらの2つの関数を宣言することはできませんということです。つまり、通常の機能として宣言すると、つまり:

void callbackForThread(){ 
    ... 
} 


void startThread(){ 
    this call threads. Something like: 
    thread(callbackForThread); 
} 

すべてが動作します。可能であれば、C++でクラス内でスレッドとコールバックを宣言する方法を知っています。 もっと遠くには、私は図書館と実際のクラスの名前の包含を省略しました。この質問に表示されるクラスは架空のものです。

+0

と思われません.... – BossShell

答えて

2

これは、Person::callbackForThreadが非表示の第1引数:thisをとるためです。

ラムダとstd::bindが便利になるところです。

thread([this]() { this->callbackForThread(); }); 

または

using namespace std::placeholders; 
thread(std::bind(&Person::callbackForThread, this, _1)); 

krzaqフィードバックから:threadstd::threadであれば、それはdetach編にする必要があるか、何らかの形で保存されました。

+5

または単に 'thread(&Person :: callbackForThread、this)'、バインドの必要はありません – PeterT

+0

はい、素晴らしいです。あなたは私の一日を作る!ありがとうございます – BossShell

+1

なぜ 'thread(&Person :: callbackForThread、this)'だけではないのですか?副次的なこととして、これは式であり、スレッドオブジェクトの最後に破棄されます。その時間までに終了していない(ほとんど起こりそうもない)場合は、 'std :: terminate'を呼び出します。 – krzaq

関連する問題