n个生产者-n个消费者
生产者为IO线程,负责收包及断开连接处理
消息者为数据处理线程,负责解析数据包以发送 共享数据格式为 pHead -> 节点 -> 节点 ->pEnd 的队列
节点包含数据
socket 套接口句柄
szbuf[BUFF_SIZE] 接收缓冲区
len 缓冲区数据长度 生产者收到数据后,肯定要锁住队列,然后才能写szbuf,写完之后解锁并唤醒一个消费者线程,
这可以采用信号量或自动重置事件,线程唤醒后要等待进入队列,进入之后解析数据,取出一个
完整数据包并解锁. 然后消费者处理数据后将响应发出。
生产者收到套接口退出事件后,也要锁住队列,删除套接口节点,解锁并关闭套接口。 但是,
有可能消费者已经将数据取出,必然会造成发送失败。 我的问题:
1. 单个线程占用锁的时间问题,生产者只依靠socket查询节点的速度是比较快的,memcpy的内存也
比较小,占锁的时间不用担心,但是消费者进入队列之后并不知道是哪个socket接收了新数据,需要
对每一个节点进行解析,直到发现取出一个完整包,这花费的时间我想是不菲的。 这必然造成生产者
在队列上的等待。 2. 生产者收到套接口关闭事件后,必然删除队列中socket节点,并closesocket(socket),这时可能
消费者线程已经取出数据,他们并不知道此时套接口是无效的,一定会造成发送失败,再次调用
closesocket.
生产者为IO线程,负责收包及断开连接处理
消息者为数据处理线程,负责解析数据包以发送 共享数据格式为 pHead -> 节点 -> 节点 ->pEnd 的队列
节点包含数据
socket 套接口句柄
szbuf[BUFF_SIZE] 接收缓冲区
len 缓冲区数据长度 生产者收到数据后,肯定要锁住队列,然后才能写szbuf,写完之后解锁并唤醒一个消费者线程,
这可以采用信号量或自动重置事件,线程唤醒后要等待进入队列,进入之后解析数据,取出一个
完整数据包并解锁. 然后消费者处理数据后将响应发出。
生产者收到套接口退出事件后,也要锁住队列,删除套接口节点,解锁并关闭套接口。 但是,
有可能消费者已经将数据取出,必然会造成发送失败。 我的问题:
1. 单个线程占用锁的时间问题,生产者只依靠socket查询节点的速度是比较快的,memcpy的内存也
比较小,占锁的时间不用担心,但是消费者进入队列之后并不知道是哪个socket接收了新数据,需要
对每一个节点进行解析,直到发现取出一个完整包,这花费的时间我想是不菲的。 这必然造成生产者
在队列上的等待。 2. 生产者收到套接口关闭事件后,必然删除队列中socket节点,并closesocket(socket),这时可能
消费者线程已经取出数据,他们并不知道此时套接口是无效的,一定会造成发送失败,再次调用
closesocket.
2、生产者关闭SOCKET,就将socket置成SOCKET_INVALID,这样消费者就知道socket已经被关闭了。