2014-04-17 27 views
1

我有寫多線程,這樣,在Linux上,這似乎同一插座代碼在我的開發測試中工作(僞上下的代碼):從多線程寫入套接字時,是否需要'選擇'以等待寫入可用性?

Mutex theSocketMutex = ...; 
int theSocket = ...; 

void Thread() { 
    while (...) { 
     ... 
     lock(theSocketMutex); 
     write(theSocket, ...); 
     unlock(theSocketMutex); 
     ... 
    } 
} 

重要的是,一個所有這些線程都使用單個套接字進行寫入(它實際上是一個SocketCAN套接字,我需要避免多個套接字上的重複傳入幀處理開銷 - 我有一個套接字,一個讀線程和多個寫線程)。

預期的行爲是write等待硬件發送緩衝區已滿(最多隻有幾微秒)而不是失敗;但我不知道如果SocketCAN驅動程序這樣做,或者如果它保證一般插座的行爲等。

所以我的問題是:是上述足夠,還是我也需要等待套接字可用於書寫,如:

void Thread() { 
    while (...) { 
     ... 
     lock(theSocketMutex); 
     if (select(theSocket+1, NULL, &fdsetWrite, NULL, &timeout) != 1) 
      ...; // fail 
     else 
      write(theSocket, ...); 
     unlock(theSocketMutex); 
     ... 
    } 
} 

工作的罰款,我的測試,但我不是在我這裏測試100%的信心。

+1

所有'select'調用會告訴你,你可以寫入至少一個字節到描述符而不用'write'(或'send')阻塞。從多個線程寫入描述符不需要,只有鎖定。 –

+0

@JoachimPileborg謝謝。如果你想發佈這個答案,我可以接受它。 –

+0

當然可以! :) –

回答

3

所有select調用會告訴你,你可以寫至少一個字節到描述符而不用write(或send)阻塞。從多個線程寫入描述符不需要,只有鎖定。

+0

太棒了;再次感謝! –