2012-09-03 8 views
5

スレッドをC++で作成し、メインスレッドと別のスレッド間で通信するにはどうすればよいですか?スレッド間での通信方法

一部のコードサンプルは高く評価されます。

+10

アンソニー・ウィリアムスの「C++並行処理」という本があります。いくつかの例を含めて、C++のスレッドを使ったプログラミングについて説明します。 **あなたの質問を**もっと具体的にしない限り、私はそれを読むことをお勧めします。 –

+0

必要なコミュニケーションの種類によって異なります。主に、共有状態(同期技法を使用してアクセスされる変数のセット)またはメッセージパッシング(パイプ、ソケットなどを使用する)のいずれかを使用できます。これらのスレッドを何のために使用する予定ですか? –

答えて

2

スレッドはスコープで変数を共有します。そのため、ミューテックスロックは非常に重要です。

#include <iostream> 
#include <pthread.h> 
main() { 
    pthread_t f2_thread, f1_thread; 
    void *f2(), *f1(); 
    int i1; 
    i1 = 1; 
    pthread_create(&f1_thread,NULL,f1,&i1); 
    pthread_create(&f2_thread,NULL,f2,&i1); 
    pthread_join(f1_thread,NULL); 
    pthread_join(f2_thread,NULL); 
} 
void *f1(int *x){ 
    std::cout << *x << std::endl; 
} 
void *f2(int *x){ 
    sleep(1) 
    std::cout << ++(*x) << std::endl; 
} 

これは、プリントアウトする必要があります:

1 
2 

を変数i1がスレッド間で共有されています

だから、あなただけの両方のスレッドに変数共通を編集することによって、かなり簡単に通信することができます。これはコミュニケーションの1つの形式です。クラスの構造体の文字列、必要なものを共有できます。

注:このコードはスレッド競合をほぼ確実に引き起こします。これは単なる例です。スレッド間でメモリを共有する場合は、常に同期とスレッドセーフプラクティスを使用する必要があります。

+0

私は、質問がPthreadsではなくC++スレッドに関する印象を受けました... –

+0

@DietmarKühlp_threadsはC++で使用できます。それは単なるスレッドに関する質問だと思っていました。 –

+0

C++では移植可能なスレッド作成とスレッド通信プリミティブが定義されています。 Pthreadは、スレッドをサポートするすべてのプラットフォームではなく一部で動作します。 –

-1

スレッドの作成はOSによって異なります。

Linuxの場合、pthreadライブラリ関数pthread_createを使用してスレッドを作成し、pthread_joinを使用してスレッドが完了するまで待つことができます。

Windowsでは、CreateThread()Windows API関数を使用してスレッドを作成し、WaitForSingleObject()関数を使用してスレッドの終了を待機させることができます。

+1

または、両方で 'std :: thread'または' boost :: thread'を使います。 – juanchopanza

+3

現在のC++標準(ISO/IEC 14882:2011)は、スレッド作成プリミティブとスレッド通信プリミティブを定義しています。つまり、OSにはまったく依存しません。 –

0

さて、私は私の最も簡単なが知っていることを教えてくれます:_beginthread

  • あなたが仕事に、このためprocess.hをincude必要があります。
  • スレッドする関数が必要です。
  • 関数のパラメータの入力は、(void *)でなければなりません。
  • 終了する必要がある場合は、機能には_endthread()が必要です。

以下のプログラムでは、2つのスレッドがpi値を見つけることと競合します。 そのうちの1人が値piを見つけた場合、他のスレッドに終了すべき旨を通知します。また、main()にはpiを見つけたものが表示されます。 3番目のスレッドは、他のスレッドの1つが終了するのを待機します。スレッドの作成で

 #include<process.h> 
     #include<windows.h> //for the Sleep() 
     #include<stdio.h> 
     volatile boolean found=false; 
     volatile int who=0; 

     void find_pi_core1(void * iterations) 
     { 

      int * ite=(int *)iterations; 
      for(int i=0;i<ite;i++) 
      { 
       //a sample of Monte-Carlo method here to find pi 
       //gets pi with more precision with additional iterations 
       if(found) _endthread(); 
      } 
      found=true;who=1; 
      _endthread();  

     } 

     void find_pi_core2(void * iterations) 
     { 

      int * ite=(int *)iterations; 
      for(int i=0;i<ite;i++) 
      { 
       //a sample of Monte-Carlo method here to find pi 
       //gets pi with more precision with additional iterations 
       if(found) _endthread(); 
      } 
      found=true;who=2; 
      _endthread(); 
     } 

     void printscreeN(void * dummy) 
     { 

      while(!found) 
      { 
       Sleep(30);  //if dont sleep, it gets a lot of cpu power 
      } 
      printf(" found! \n"); 
      _endthread(); 
     } 

     int main() 
     { 

         Function name 
         ^  Stack size 
          |  ^   Function parameter 
          |   |   ^
      _beginthread(find_pi_core1,0,(void *) 3000000); 
      _beginthread(find_pi_core2,0,(void *) 2500000); 
      _beginthread(printscreeN,0,(void *)0); 
      Sleep(3000); 
      if(found) 
      { 
       printf("pi has been found! core-%d has found pi first ",who); 
      } 
      else 
      {printf("pi has not been bound!");} 
      return 0; 
     } 
1

答えは(私はそれだと思う)明白である、のいずれかstd::threadお持ちの場合はC++ 11またはboost::threadそうでない場合は、そのメッセージの場合には、それはあなたの問題とあなたのプログラミングスタイルに依存して渡します。
私はboost::asio::io_serviceの使用を好みます。これは非常に柔軟で、他のスレッドのコンテキストで実行される関数や関数オブジェクトを投稿することができます。このテクニックを使用すると、ミューテックスなどは必要ありません。スレッドをコンシューマとプロデューサにグループ化することもできますし、他の多くの便利な機能も利用できます。