0

ここに新しいコードスニペットがあります:

#define SIMU_TIME 30
pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER ; 
pthread_cond_t condition = PTHREAD_COND_INITIALIZER ; 
void *timer(void *Ptr) 
{    while ((float) clock()/CLOCKS_PRE_TICKS < SIMU_TIME) 
       {  float mean = (float) Ptr ; 
         float interval = exponential(mean) ; 
         float goal = (float) clock()/CLOCKS_PRE_TICKS + interval ; 
         pthread_mutex_lock(&mutex) ;
         while(goal > (float) clock()/CLOCKS_PRE_TICKS ) ; 
        pthread_mutex_unlock(&mymutex) ; 
       }
return(NULL) ; 
}
void *AddPacket(void *Ptr) 
{
   pthread_cond_lock(&mymutex) ;
   pthread_cond_wait(&condition, &mymutex) ; 
     // do business
    pthread_unlock_mutex(&mymutex) ; 
   }
int main()
{  float mean = 1.5 ; 
  pthread_t thread1, thread2 ; 
  pthread_create(&thread1, NULL, &timer, (void *) mean) ; 
  pthread_create(&thread2, NULL, &AddPacket, NULL) ; 
  pthread_join(thread1, NULL) ; 
  pthread_join(thread2, NULL) ; 
  pthread_mutex_destroy(&mymutex) ; 
  pthread_cond_destroy(&condition) ;
  pthread_exit(NULL) ; 
}

pthread_cond_waitは通常、1つのスレッドが特定のしきい値に達するまで属性にアクセスしない場合に使用されるため、競合状態を回避するためにこの変数に関連付けられたミューテックスを使用する必要がありますが、私の場合、2つのスレッドは実際には使用しません同じメモリ領域にアクセスする必要があります。これは、最初のスレッドで許可されたときに2番目のスレッドをスケジュールする方法にすぎません。この状況では、「pthread_cond_wait」の前に「pthread_mutex_lock」を呼び出す必要がありますか?

4

1 に答える 1

0

SIGALRM問題は、同時に 2 つのアラーム、または同時に 2 つのハンドラーを持つことができることです。これは多くの方法で解決できます。1 つの方法は、イベント キューを使用することです。

また、別の問題があります。それは、シグナル ハンドラーを に設定することですthis。これには多くの問題があります。1つ目はthis、関数では無効です。これは、カーネルによって直接呼び出されるスレッド関数であるため、有効なthis. 2 つ目は、ハンドラーがクラスではなく関数でなければならないことです。シグナル ハンドラーはオペレーティング システムから呼び出され、C++ クラスの概念がないことに注意してください。

上記の両方の問題は、何らかのイベント キューを実装することで解決されます。

スレッド関数にも問題があり、最後まで実行するとスレッドも終了します。

于 2012-08-05T15:01:36.210 に答える