1

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% の自信があるわけではありません

4

1 に答える 1

3

この呼び出しでわかることは、ブロッキングなしで(または)select記述子に少なくとも 1 バイトを書き込むことができるということだけです。複数のスレッドから記述子への書き込みには必要ありません。ロックだけが必要です。writesend

于 2014-04-17T14:04:18.750 に答える