2013-02-01 53 views
0

我正在寫一個網絡應用程序。 並且有關於線程競爭狀態的一些問題。linux多線程編程,原子碼區域

「cd」是套接字描述符。 我的一個線程檢索套接字描述符 並通過套接字發送一些數據。

讓我們說map_sd返回5.但是另一個線程可能會關閉套接字5,而 會重新分配另一個線程。這會破壞程序的邏輯。

   // wait until there is valid descriptor mapping 
       while(!(cd = map_sd(sd))){ 
        sleep(1); 
       }     

       // forward PAYLOAD header 
       if(send(cd, &payload, sizeof(PAYLOAD), MSG_NOSIGNAL) < 0){  
        printf("send fail 813\n"); 
       } 

我想要的是讓上面的代碼「原子」 我怎麼能做到這一點的時候,我在Linux中使用並行線程庫?

預先感謝您。

回答

0

你需要一個條件變量和一個互斥:

pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 

在線通過CD:

pthread_mutex_lock(&lock); 
/* here you pass cd through a data structure or whatever */ 
pthread_cond_signal(&cond); 
pthread_mutex_unlock(&lock); 

在線程等待CD:

pthread_mutex_lock(&lock); 
if (pthread_cond_wait(&cond, &lock) != 0) { 
    /* handle error */ 
} 
/* here you can acquire cd */ 
pthread_mutex_unlock(&lock); 

這應該是它 - 你使用一個條件變量和一個鎖來進行獨佔訪問,並通知另一個線程一個資源現在是一個vailable。 pthread_cond_wait()釋放等待的鎖定,並在其他線程通過pthread_cond_signal()通知後重新獲取。

編輯:格式。

+0

謝謝!它的幫助 – daehee