2016-12-27 22 views
1

私はマルチスレッド化のためにC++とpthreadを使用しています。私は作成呼び出しの順にスレッドを実行したい。実行順にpthreadを作成

retrnThread=pthread_create(&thread_id,NULL,&HandleNotifications,(void*)Status); 

上記のコードでは、コードは非常に短時間で3〜4回実行され、スレッドはランダムな順序で実行されます。私は作成されたのと同じ順序でスレッドの実行をしたい。

retrnThread=pthread_create(&thread_id,NULL,&HandleNotifications1,(void*)Status); 
retrnThread=pthread_create(&thread_id,NULL,&HandleNotifications2,(void*)Status); 
retrnThread=pthread_create(&thread_id,NULL,&HandleNotifications3,(void*)Status); 
retrnThread=pthread_create(&thread_id,NULL,&HandleNotifications4,(void*)Status); 

実行順序は次のようになります。 HandleNotifications1 HandleNotifications2 HandleNotifications3 HandleNotifications4

ここでは、すべてのスレッドが互いに独立しています。私は彼らに参加するか、またはそれらを同期させる必要はありません。

+2

_「参加する必要はありません。」_スレッドを特定の順序で実行したい場合は、実行する必要があります。 –

+2

同時に実行できない場合、4つのスレッドを作成する際のポイントは何ですか?通知を順番に処理するスレッドを1つ作成します(スレッドが必要な場合)。 – Mat

答えて

0

上記のコードでは、コードは非常に短時間で3〜4回実行され、スレッドはランダムな順序で実行されます。

これは正常に動作します。スレッドが作成されるとオペレーティングシステムに残され、次回にそのスレッドがスケジュールされます。

作成したのと同じ順序でスレッドを実行したいです。

すべてのスレッドで使用されるカウントセマフォを使用して、特定のカウンタ値を待機させることができます。

0

私はC#の非同期/待つ/タスク<>タスクベースの非同期パターン(TAP)とにもっと慣れている私はまだ/場合はC++は同じ機能を達成できる方法を理解する必要があります。

私たちは、このようなものを想像することができ(「メイン」関数が別の外部のスレッドによって起動されると想像)

#include <iostream> 
#include <future> 

using namespace std; 

void handlenotification(int i = -1) 
{ 
    cout << "Task number " << i << endl; 
    //Long treatment here 
} 

int main() 
{ 
    cout << "Hello world!" << endl; 
    for (int i=0;i<4;i++) 
    { 
     async(launch::async,handlenotification,i); 
    } 

    cout << "Bye!" << endl; 
    return 0; 
} 

結果が

Hello world! 
Task number 0 
Task number 1 
Task number 2 
Task number 3 
Bye! 

(ノーインターレースの文字列)である。しかし、それはありません呼び出しスレッドに制御を戻しません(さよならは終わりです)

私たちは何かもっとcomp (非同期呼び出しにこの時間を延期することによって)これを達成するためにlicated

#include <iostream> 
#include <future> 
#include <thread> 
#include <chrono> 
#include <list> 

using namespace std; 
using namespace chrono; 

list<future<void>> task_list; 

void handlenotification(int i = -1) 
{ 
    //standard output thread safety omitted for example !! 
    cout << "Task number " << i << endl ; 
    this_thread::sleep_for(seconds(i)); 
} 

void naive_background_worker(void) 
{ 
    while(true) 
    { 
     //Thread safety omitted for example !! 
     if (!task_list.empty()) 
     { 
      task_list.front().wait(); 
      task_list.pop_front(); 
     } 
     else 
     { 
      //naive 
      this_thread::sleep_for(milliseconds(50)); 
     } 
    } 

} 

int main() 
{ 
    //standard output thread safety omitted for example !! 
    cout << "Hello world!" << endl; 
    for (int i=1;i<=4;i++) 
    { 
     //Thread safety for list omitted for example !! 
     task_list.push_back(async(launch::deferred,handlenotification,i)); 
    } 

    thread back_worker = thread(naive_background_worker); 


    cout << "Bye!" << endl; 

    back_worker.join(); 

    return 0; 
} 

結果がここにCOUTの(何もスレッドセーフではありません! +バックグラウンドワーカーを終わらせることはありません)

Hello world! 
Bye!Task number 
1 
Task number 2 
Task number 3 
Task number 4 
関連する問題