日期:2014-05-16  浏览次数:20618 次

再次请教 unix 下 多线程(进程)中对同一个socket_id处理的问题。
前几天完成个进程,大体是这样的:
socket客户端进程连上服务端后,创建两个线程,一个线程只负责发送(send)数据,另一个线程只负责接收(recv)数据。

这样没有问题,后来做了一下修改,在send 线程中有时也做 recv 的动作,也就是两个线程都会在一个socket_id 上 recv,这就有问题了,间或会有一个线程挂起僵死,只到超时后pthread_kill掉重建,有时候线程正常运行,但两个线程接收的数据是错位的,有时候也会工作正常。

我采用的是多路复用阻塞方式,也是当poll发现有数据到来时,就调用recv 去接收,而send和recv、poll都是不可重入的,也就是存在两个线程可能同时认为这个socket_id有数据到来了,再同时调用recv去接收数据,而导至接收数据的不完整,我想如果换成read/write去操作socket_id不知道是否可行,还没有试呢。

以上是我的描述,也不知道对不对,向朋友们请教,类似这样的问题该如何处理呢?多线程(进程)如何处理同一个socket_id呢?

另外:多个线程(进程)中的poll系统调用会不会都发现同一组FD可用了,然后都对这一组FD进程操作呢?想研究这一类问题看些什么书比较好呢?请大家帮忙。



------解决方案--------------------
建立2个 缓冲队列,

建立2个线程.

一个线程负责在 socket 上 select 进行收发数据.
从队列 1 中读取数据,并发送出去,
把接收到的数据放入队列 2 中,

线程2 冲 队列2 中读取数据, 处理完后,放到 队列 1 中,
注意 在队列里取数据的时候加锁.
------解决方案--------------------
多线程多进程操作同一个socket, 需要进行互斥操作的

对socket操作如同对文件进行操作

操作过程中可能导致cpu切换的

切换后可能另外的线程就去读些了