Писать и читать в один сокет с разных потоков
От: OdesitVadim Украина  
Дата: 08.04.09 22:38
Оценка:
Хочется возможно немного странного — есть один сокет (TCP), который хочется выдать двух тредам одного приложения. При этом один будет писать данные в него, а другой только читать. Можно ли так делать?
Одну маленькую проблему вижу сразу — надо закрывать этот сокет только в одном треде, а в втором не трогать, либо обрабатывать EBADF.
Re: Писать и читать в один сокет с разных потоков
От: Cyberax Марс  
Дата: 08.04.09 22:51
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

OV>Хочется возможно немного странного — есть один сокет (TCP), который хочется выдать двух тредам одного приложения. При этом один будет писать данные в него, а другой только читать. Можно ли так делать?

Да, можно.

OV>Одну маленькую проблему вижу сразу — надо закрывать этот сокет только в одном треде, а в втором не трогать, либо обрабатывать EBADF.

Угу.
Sapienti sat!
Re: Писать и читать в один сокет с разных потоков
От: neFormal Россия  
Дата: 08.04.09 23:05
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

OV>Хочется возможно немного странного — есть один сокет (TCP), который хочется выдать двух тредам одного приложения. При этом один будет писать данные в него, а другой только читать. Можно ли так делать?


а зачем, если не секрет?.
чтобы так оригинально передавать данные и не заморачиваться на синхронизацию?.
...coding for chaos...
Re[2]: Писать и читать в один сокет с разных потоков
От: OdesitVadim Украина  
Дата: 09.04.09 06:15
Оценка:
Здравствуйте, neFormal, Вы писали:

F>а зачем, если не секрет?.

F>чтобы так оригинально передавать данные и не заморачиваться на синхронизацию?.
Просто есть генератор неких данных, и есть потребитель — эти оба со стороны сервера. С другой стороны есть клиент который принимает эти данные и отсылает. Укладывать генератор и потребитель в один поток — надо думать, как делить всё на мелкие порции, что бы и писать, и читать одновременно. А вот клиент привередлив к "скорости подсовывания данных" — ему надо стабильно.
Сам генератор данных и потребитель никак не связаны между собой, разве что старт и остановка.

Но параллельно вопрос, а чем оптимальней связать два потока между собой, что бы они могли обмениваться примитивными командами (одного байта хватит с головой)? Под Windows я бы использовал PostMessage например, или SendMessage. А в Линукс? Пайпы? Всё равно основной цикл обеих потоков — это select.
Re: Писать и читать в один сокет с разных потоков
От: Alu Россия  
Дата: 10.04.09 11:57
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

OV>Одну маленькую проблему вижу сразу — надо закрывать этот сокет только в одном треде, а в втором не трогать, либо обрабатывать EBADF.


Используйте shutdown. Этот системный вызов позволяет закрыть соединение в одном направлении.
Настоящему индейцу завсегда везде ништяк!
Re[3]: Писать и читать в один сокет с разных потоков
От: Alu Россия  
Дата: 10.04.09 12:16
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

OV>Здравствуйте, neFormal, Вы писали:


OV>Но параллельно вопрос, а чем оптимальней связать два потока между собой, что бы они могли обмениваться примитивными командами (одного байта хватит с головой)? Под Windows я бы использовал PostMessage например, или SendMessage. А в Линукс? Пайпы? Всё равно основной цикл обеих потоков — это select.


Если Вам устроит обмен данными между нитями без участия select, то проще использовать общую память + мьютекс.
Если хотите использовать select для единообразия, посмотрите в сторону UNIX Sockets.
Настоящему индейцу завсегда везде ништяк!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.