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

4

1 回答 1

0

问题是您可以同时有两个警报,或者同时有两个SIGALRM处理程序。这可以通过多种方式解决。一种方法是使用事件队列。

您还有另一个问题,那就是您将信号处理程序设置为this. 这有很多问题。第一个是this在函数中无效。原因是它是一个由内核直接调用的线程函数,因此没有有效的this. 第二个是处理程序必须是一个函数,而不是一个类。请记住,信号处理程序是从操作系统调用的,它没有 C++ 类的概念。

上述两个问题都将通过实现某种事件队列来解决。

线程函数也有一个问题,当它们运行到最后时,线程也结束了。

于 2012-08-05T15:01:36.210 回答