1

我有在 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% 有信心。

4

1 回答 1

3

该调用将告诉您的是,您可以在没有(或)阻塞select的情况下将至少一个字节写入描述符。从多个线程写入描述符不需要它,只有锁是。writesend

于 2014-04-17T14:04:18.750 回答