Нужно ли мне «выбирать», чтобы дождаться доступности записи при записи сокета из нескольких потоков?

У меня есть код, который записывает в один и тот же сокет с несколькими потоками, как этот, в 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% в своих тестах здесь.


person Jason C    schedule 17.04.2014    source источник
comment
Все, что вам скажет вызов select, это то, что вы можете записать хотя бы один байт в дескриптор без блокировки write (или send). Это не нужно для записи в дескриптор из нескольких потоков, нужна только блокировка.   -  person Some programmer dude    schedule 17.04.2014
comment
@JoachimPileborg Спасибо. Если вы хотите опубликовать это как ответ, я могу принять это.   -  person Jason C    schedule 17.04.2014


Ответы (1)


Все, что вам скажет вызов select, это то, что вы можете записать хотя бы один байт в дескриптор без блокировки write (или send). Это не нужно для записи в дескриптор из нескольких потоков, нужна только блокировка.

person Some programmer dude    schedule 17.04.2014