2015-06-03 2 views
1

среды: 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 ПРИЕМ А.2 от клиента ??
Могу ли я запретить контекстный переключатель до тех пор, пока не появится сообщение 1 recv A.2?

+0

@ErikMan Это звучит достаточно хорошо для ответа. –

+2

Вопрос здесь действительно * почему * у вас есть два потока чтения-записи на одного клиента? Это не соответствует чему-то реальному. У клиента только один. Я мог понять один прочитанный поток и один поток записи, но два потока чтения-записи просто не имеют смысла. – EJP

+0

^^ что @EJP говорит. Если вы настаиваете на мультиплексировании разных потоков в одно соединение (и вам не нужно - для чего нужны сокеты/порты), вы должны использовать один поток tx, один поток rx и протокол для потоков mux/demux. Вы пытаетесь по-настоящему странно :( –

ответ

0

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

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

Смежные вопросы