我有寫多線程,這樣,在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%的信心。
所有'select'調用會告訴你,你可以寫入至少一個字節到描述符而不用'write'(或'send')阻塞。從多個線程寫入描述符不需要,只有鎖定。 –
@JoachimPileborg謝謝。如果你想發佈這個答案,我可以接受它。 –
當然可以! :) –