我有这样的代码,可以在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)的情况下向描述符写入至少一个字节。从多个线程写入描述符并不需要,只有锁是需要的。

关于c - 从多个线程写入套接字时,是否需要 'select'等待写入可用性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23134942/

10-16 18:12