2012-04-28 44 views
-1

我试图模拟使用pthreads发送和接收功能。我确实实现了下面的代码。但有时候会挂起或产生错误的结果。使用pthreads模拟发送和接收

int g_sender,g_receiver; //global variables to keep track of the sender and receiver 
void send(double ** data,int sender,int receiver, int size[],int block_size){ 
    int i; 
    pthread_mutex_lock(&lock); 
    for (i=0;i<size[0];i++) 
      memcpy(sharedA[i],data[i],size[1]*block_size); 
    g_sender = sender; 
    g_receiver = receiver; 
    sem_wait(&sem); 
    pthread_mutex_unlock(&lock); 

} 

void receive(double ** data, int sender,int receiver, int size[],int block_size){ 
     int i; 
    while(!(sender==g_sender && receiver==g_receiver)); 
    for(i=0;i<size[0];i++) 
     memcpy(data[i],sharedA[i],size[1]*block_size); 
    g_sender =-1; 
    g_receiver = -1; 
    sem_post(&sem); 
} 

你觉得我在这里错过了什么?

感谢

回答

0

很多:)

  • 什么是持有该锁的目的是什么?
  • 永不等待信号量时锁定
  • 总是检查库函数的返回值。特别是 sem_功能是中断的,你必须检查如果 中断发生的sem_wait
  • ,如果你不那么与POSIX线程经历只是不使用 sem_t。改用互斥锁和条件变量。它们更高的 级接口更适合应用程序代码。
+0

我正在使用锁来保护来自其他线程的全局变量sharedA,g_sender,g_receiver,直到从接收器读取它为止。我使用信号来模拟阻塞发送。 – user504453 2012-04-28 08:08:35

+0

@ user504453,总之你的设计对我来说没什么意义 – 2012-04-28 11:02:09