У меня есть код, который записывает в один и тот же сокет с несколькими потоками, как этот, в 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
). Это не нужно для записи в дескриптор из нескольких потоков, нужна только блокировка. - person Some programmer dude   schedule 17.04.2014