我是否需要选择'从多个线程编写套接字时等待写入可用性?

时间:2014-04-17 13:48:03

标签: c linux sockets socketcan

我的代码在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); 
        ...
    }
}

对我的测试工作正常,但我对这里的测试没有百分之百的信心。

1 个答案:

答案 0 :(得分:3)

select调用将告诉您的所有内容是,您可以在没有write(或send)阻止的情况下向描述符写入至少一个字节。从多个线程写入描述符不需要,只有锁定。