Хочется возможно немного странного — есть один сокет (TCP), который хочется выдать двух тредам одного приложения. При этом один будет писать данные в него, а другой только читать. Можно ли так делать?
Одну маленькую проблему вижу сразу — надо закрывать этот сокет только в одном треде, а в втором не трогать, либо обрабатывать EBADF.
Здравствуйте, OdesitVadim, Вы писали:
OV>Хочется возможно немного странного — есть один сокет (TCP), который хочется выдать двух тредам одного приложения. При этом один будет писать данные в него, а другой только читать. Можно ли так делать?
Да, можно.
OV>Одну маленькую проблему вижу сразу — надо закрывать этот сокет только в одном треде, а в втором не трогать, либо обрабатывать EBADF.
Угу.
Здравствуйте, OdesitVadim, Вы писали:
OV>Хочется возможно немного странного — есть один сокет (TCP), который хочется выдать двух тредам одного приложения. При этом один будет писать данные в него, а другой только читать. Можно ли так делать?
а зачем, если не секрет?.
чтобы так оригинально передавать данные и не заморачиваться на синхронизацию?.
...coding for chaos...
Re[2]: Писать и читать в один сокет с разных потоков
Здравствуйте, neFormal, Вы писали:
F>а зачем, если не секрет?. F>чтобы так оригинально передавать данные и не заморачиваться на синхронизацию?.
Просто есть генератор неких данных, и есть потребитель — эти оба со стороны сервера. С другой стороны есть клиент который принимает эти данные и отсылает. Укладывать генератор и потребитель в один поток — надо думать, как делить всё на мелкие порции, что бы и писать, и читать одновременно. А вот клиент привередлив к "скорости подсовывания данных" — ему надо стабильно.
Сам генератор данных и потребитель никак не связаны между собой, разве что старт и остановка.
Но параллельно вопрос, а чем оптимальней связать два потока между собой, что бы они могли обмениваться примитивными командами (одного байта хватит с головой)? Под Windows я бы использовал PostMessage например, или SendMessage. А в Линукс? Пайпы? Всё равно основной цикл обеих потоков — это select.
Здравствуйте, OdesitVadim, Вы писали:
OV>Одну маленькую проблему вижу сразу — надо закрывать этот сокет только в одном треде, а в втором не трогать, либо обрабатывать EBADF.
Используйте shutdown. Этот системный вызов позволяет закрыть соединение в одном направлении.
Настоящему индейцу завсегда везде ништяк!
Re[3]: Писать и читать в один сокет с разных потоков
Здравствуйте, OdesitVadim, Вы писали:
OV>Здравствуйте, neFormal, Вы писали:
OV>Но параллельно вопрос, а чем оптимальней связать два потока между собой, что бы они могли обмениваться примитивными командами (одного байта хватит с головой)? Под Windows я бы использовал PostMessage например, или SendMessage. А в Линукс? Пайпы? Всё равно основной цикл обеих потоков — это select.
Если Вам устроит обмен данными между нитями без участия select, то проще использовать общую память + мьютекс.
Если хотите использовать select для единообразия, посмотрите в сторону UNIX Sockets.