这里是新的代码片段:
#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 通常在一个线程在达到某个阈值之前不访问属性时使用,我们必须使用与此变量关联的互斥锁以避免任何竞争条件,但在我的情况下,这两个线程实际上并不需要访问相同的内存区域,这只是在第一个线程允许时调度第二个线程的一种方式。在这种情况下,是否有必要在“pthread_cond_wait”之前调用“pthread_mutex_lock”?