Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
goodmansem
Зарегистрирован: 15.08.2006 Сообщения: 9 Откуда: Томск
|
Добавлено: Вт Ноя 11 2008 09:06 Заголовок сообщения: Использование функций по работе с сокетами в разных потоках |
|
|
Такой вопрос: могу ли я использовать функции по работе с сокетами в разных потоках для одного и того же сокета в одно и то же время? Предположим чтение и запись данных, когда соединение уже установлено?
Поток 1
{
...
send(sock_id, ...);
...
}
Поток 2
{
...
recv(sock_id, ...);
...
} |
|
Вернуться к началу |
|
|
Bad Lamer
Зарегистрирован: 23.09.2004 Сообщения: 61
|
Добавлено: Чт Ноя 13 2008 15:47 Заголовок сообщения: |
|
|
Я думаю один из оптимальных вариантов будет такой: в потоке приёма, сделать цикл с select на проверку сокета на готовность данных для чтения, и в этом цикле читать, а в потоке для отправки сделать цикл с select на проверку сокета на готовность отправки данных, и соответственно отправлять по готовности... |
|
Вернуться к началу |
|
|
goodmansem
Зарегистрирован: 15.08.2006 Сообщения: 9 Откуда: Томск
|
Добавлено: Чт Ноя 13 2008 19:57 Заголовок сообщения: |
|
|
Хммм...неплохое решение! Но меня интересует именно тот момент, когда оба потока вызвали, к примеру, тот же самый select (send или recv - это не принципиально). Как вот эти самые функции ведут себя, когда их вызывают ОДНОВРЕМЕННО? Гарантируется ли устойчивая работа этих функций? Не возникнет ли исключительных ситуаций или deadlock-ов? |
|
Вернуться к началу |
|
|
Bad Lamer
Зарегистрирован: 23.09.2004 Сообщения: 61
|
Добавлено: Сб Ноя 15 2008 11:26 Заголовок сообщения: |
|
|
Вообще для каждого сокета создаётся два буфера: один для приёма данных, другой для передачи. Соответственно recv и send обращаются к разным буферам, и исключения не должно возникнуть (во всяком случае на почве доступа к буферам).
P.S. Ситуацию одновременного обращения к сокету функций send и recv можно смоделировать, например, задать максимальное значение для буфера приёма, и в момент начала приёма сразу передавать данные в другом потоке. Естесствено, нужно чтоб на другом конце соединения был передан большой блок данных. |
|
Вернуться к началу |
|
|
|