3

シリアル化したい3つのスレッドがあり
ます。pthreadを使用しているのはC++です。{A、B、C、A、B、C、A、B、C、...............}になるように出力を並べ替えようとしています。シリアル化したいスレッドがたくさんあるので、これを行っています。私が欲しい出力は次のとおりです。

Thread A
Thread B
Thread C
Thread A
Thread B
Thread C
Thread A
Thread B
Thread C
Thread A
Thread B
Thread C
........
........

これは私が持っているコードです。ハングすることもあれば、1つまたは2つのループで実行されてからハングすることもあります。あなたが問題をどう思うか聞きたいです。私のコードは:
thread_test.cpp

#include <stdio.h>
#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int condition = 0;
int count = 0;

void* thread_c( void * arg )
{
   while( 1 )
   {
      pthread_mutex_lock( &mutex );
      while( condition != 2 )
         pthread_cond_wait( &cond, &mutex );
      printf( "Thread C");
      condition = 0;
      pthread_cond_signal( &cond );
      pthread_mutex_unlock( &mutex );
   }

   return( 0 );
}

void* thread_b( void * arg )
{
   while( 1 )
   {
      pthread_mutex_lock( &mutex );
      while( condition != 1 )
         pthread_cond_wait( &cond, &mutex );
      printf( "Thread B" );
      condition = 2;
      pthread_cond_signal( &cond );
      pthread_mutex_unlock( &mutex );
   }

   return( 0 );
}

void*  thread_a( void * arg )
{
   while( 1 )
   {
      pthread_mutex_lock( &mutex );
      while( condition != 0 )
         pthread_cond_wait( &cond, &mutex );
      printf( "Thread A");
      condition = 1;
      pthread_cond_signal( &cond );      
      pthread_mutex_unlock( &mutex );
   }
   return( 0 );
}

int main( void )
{
    pthread_t  thread_a_id;
    pthread_create( &thread_a_id, NULL, &thread_a, NULL );
    pthread_t  thread_b_id;
    pthread_create( &thread_b_id, NULL, &thread_b, NULL );
    pthread_t  thread_c_id;
    pthread_create( &thread_c_id, NULL, &thread_c, NULL );
    int a = pthread_join(thread_a_id, NULL);
    int b = pthread_join(thread_b_id, NULL);
    int c = pthread_join(thread_c_id, NULL);
}

コードをコンパイルするには、

g++ -lpthread -std=gnu++0x thread_test.cpp
4

4 に答える 4

7

問題は、pthread_cond_signal()待機中のスレッドを自由に選択できることですが、コードは特定のスレッドを選択することに依存しています。

に置き換えるpthread_cond_signal()pthread_cond_broadcast()、コードがストールしなくなります。これは観察として言及しています。これが正しい修正であると私はまだ確信していません。

于 2012-12-10T09:45:33.503 に答える
3

なぜこの程度までスレッドをシリアライズしたいのかという問題はさておき、問題は、複数のスレッドが条件で待機している場合pthread_cond_signal( &cond )、条件をチェックするためにそのうちの 1 つだけを起動する可能性があることです (実際には、それは意図されたものであり、通常は望ましいことです)。振る舞い - 複数のウェイターが解放された場合、それはむしろ事故です)。

たとえば、thread_a()設定condition = 1すると、目を覚ますつもりthread_bです。ただし、thread_cと同時に待機する場合がありますthread_b。を使用すると、どちらがリリースされるかをpthread_cond_signal制御できません。thread_bthread_c

代わりに使用pthread_cond_broadcast( &cond )して、すべてのウェイターを起こします。

于 2012-12-10T09:52:52.027 に答える
0

各スレッドに 1 つずつ、3 つの条件変数。スレッド A は、1 つのスレッド B が待機している 1 つのスレッド C に信号を送るフォームから、1 つのスレッド A が待機している 1 つのスレッドに信号を送る...

しかし、3 つのスレッドを並列に実行するだけなら、何の役に立つのでしょうか。

于 2012-12-10T09:45:18.943 に答える
0

これを調べる必要があります:

于 2012-12-10T09:46:26.113 に答える