2016-12-18 6 views
-8

スレッドで実行される関数で現在のスレッドIDを取得するにはどうすればよいですか? 私はこれを試しましたが、うまくいきません。スレッドで実行される関数で現在のスレッドIDを取得するにはどうすればよいですか?

#include <thread> 
#include <iostream> 

using namespace std; 

#define NUM_TH 4 

void printhello(thread t) { 
    auto th_id = t.get_id(); 
    cout << "Hello world! Thread ID, "<<th_id<< endl; 
} 

void main() { 
    thread th[NUM_TH]; 

    for (int i = 0; i < NUM_TH; i++) { 
     th[i]=thread(printhello,th[i]); 
     th[i].join(); 
    } 

} 

私はエラーがそれはとても多くの理由のためではない「仕事」をし

+3

_うまく動作しません。少し曖昧です。それはコンパイルされますか?エラーなしで実行されますか?間違った結果を出すだけですか?もう少し具体的にする – Tas

+1

'th [1]'を 'thread'コンストラクタに渡すと、まだ初期化されていません。つまり、 'printhello'を実行するものではなく、空白の無効な' thread'オブジェクトです。 – qxz

+0

Stack Exchangeへようこそ。ガイドを読んだことがありますか、特に「良い質問をする方法」はありますか?問題が実際何であるかをあなたに教えてくれなかったので、あなたは下投票され、投票に終わりました。私たちがあなたを助けることができるように、質問を[編集]してください。 (あなたはあなたの[mcve]に必要なすべてのヘッダーも含めるべきです) –

答えて

0

を「tに、ボイドから、引数1を変換することはできません」取得しています。まず第一にそれがコンパイルされていることを確認してください。第2に、スレッドは文字列のような単純なクラスと似ていません。スレッドをコピーすることはできません。スレッドを移動することしかできません。あなたがやっていることは、 "空の"スレッドを初期化して、その上に別のスレッドをコピーしようとすることです。配列が必要な場合は、代わりにポインタを使用します。現在のスレッドIDを取得するには、this_thread :: get_id();を使用する必要があります。

#include <thread> 
#include <iostream> 

#define NUM_TH 4 

using namespace std; 

void printhello() { 
    auto th_id = this_thread::get_id(); 
    cout << "Hello world! Thread ID, "<< th_id << endl; 
} 

int main() { 
    thread* th[NUM_TH]; 

    for (int i = 0; i < NUM_TH; i++) 
    { 
     th[i] = new thread(printhello); 
     th[i]->join(); 
    } 
} 
0

代わりに関数にスレッドを渡すので、あなたはstd::this_threadでスレッドを実行printhello'sにアクセスすることができました。

したがって、引数を削除して代わりにstd::thread::id this_id = std::this_thread::get_id();を使用してください。

関連する問題