Переключение контекста многопоточного сокета в c

среда: Linux
язык: C

Если у меня есть серверный и клиентский процессы.
сервер использует сокет для связи с клиентом.

В процессе сервера он имеет два потока (поток 1, поток 2).
(поток 1 и поток 2 используют один и тот же файловый дескриптор для связи с клиентом).
В клиентском процессе это всего лишь один поток.

Я исключил
сервер:

thread 1:
send message A.1 to client
recv message A.2 from client

thread 2:
send message B.1 to client
recv message B.2 from client

но многопоточность возможно произошло переключение контекста

сервер:

thread 1:
send message A.1 to client

context switch

thread 2: 
send message B.1 to client
recv message A.2 from client

context switch

thread 1:
recv message B.2 from client

как избежать получения потока 2 recv A.2 от клиента??
Могу ли я предотвратить переключение контекста до сообщения потока 1 recv A.2?


person Tom    schedule 03.06.2015    source источник
comment
@ErikMan Звучит достаточно хорошо для ответа.   -  person Pavel Šimerda    schedule 03.06.2015
comment
Вопрос здесь действительно в том, почему у вас есть два потока чтения-записи для каждого клиента? Это не соответствует ничему реальному. У клиента только один. Я мог бы понять один поток чтения и один поток записи, но два потока чтения-записи просто не имеют смысла.   -  person user207421    schedule 03.06.2015
comment
^^ что говорит @EJP. Если вы настаиваете на мультиплексировании разных потоков в одно соединение (и вам это не нужно - для этого нужны сокеты/порты), вам следует использовать один поток tx, один поток rx и протокол для мультиплексирования/демультиплексирования потоков. Вы пытаетесь сделать очень странную вещь :(   -  person Martin James    schedule 03.06.2015


Ответы (1)


Самый простой (плохая практика, неоптимальный) способ - иметь мьютекс, который блокирует поток 2 для отправки сообщения B.1 до тех пор, пока не будет получен A.2.

Лучшим (и более сложным способом) было бы иметь один поток, который получает ответы и отправляет сообщения в правильный поток, но тогда вам нужен цикл обработки сообщений в каждом потоке для связи с диспетчером.

person Erik Man    schedule 03.06.2015