Linux で、このように複数のスレッドで同じソケットに書き込むコードがあります。これは、私の開発テスト (疑似コード) で動作しているようです。
Mutex theSocketMutex = ...;
int theSocket = ...;
void Thread () {
while (...) {
...
lock(theSocketMutex);
write(theSocket, ...);
unlock(theSocketMutex);
...
}
}
これらすべてのスレッドが書き込み用に 1 つのソケットを使用することが重要です (実際には SocketCAN ソケットであり、複数のソケットで受信フレーム処理が重複するオーバーヘッドを回避する必要があります。1 つのソケット、1 つの読み取りスレッド、および複数の書き込みがあります)。スレッド)。
意図された動作は、write
ハードウェア送信バッファがいっぱいになった場合 (せいぜい数マイクロ秒) に失敗するのではなく待機することです。しかし、SocketCANドライバーがこれを行うのか、それとも一般的なソケットの動作が保証されているのかはわかりません.
だから私の質問は:上記で十分ですか、それともソケットが書き込み可能になるのを待つ必要がありますか?例えば:
void Thread () {
while (...) {
...
lock(theSocketMutex);
if (select(theSocket+1, NULL, &fdsetWrite, NULL, &timeout) != 1)
...; // fail
else
write(theSocket, ...);
unlock(theSocketMutex);
...
}
}
私のテストでは問題なく動作していますが、ここでのテストに 100% の自信があるわけではありません。