ここに新しいコードスニペットがあります:
#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」を呼び出す必要がありますか?