2012-04-28 45 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