1.最近开发项目:
大体框架如下:
1. 主线程接收命令, 放进队列 1 中. (命令分 2 种: 本地执行命令; 网路传输命令)
2. 处理线程: 从队列 1 中取出依次取出命令进行处理;
分两种情况: 1. 取到本地命令, 直接执行, 并立即将结果放入队列 2 中, 使用信号量 通知主线程 接收处理结果;
2. 网络传输命令, 本地立即组包, 成功后放入队列 3 中, 使用信号量通知 发送线程去发送数据;
3. 发送线程: 接收到信号量通知后, 获取队列 3 将出队的元素, 发送至指定的 服务器地址, 注意: 队列中此时 发送的该元素不会被删除; 并将该元素的值 与 发送时间写入链表 1 中;
4. 接收线程: 一直阻塞在接收, 接收到信息后, 马上将信息进行解包, 判断数据包正确与否以及是否为服务器应答或推送, 若为应答: 删除 线程3(发送线程)中 队列3刚发送的元素,
以及链表1 中对应的元素, 并将解包后的数据放入 队列 2 中, 使用信号量通知主线程 接收处理结果;
5. 时间线程: 每隔 5s, 对链表进行遍历, 看链表 1 中是否有元素存在, 并判断该元素是否 接收超时. 如超时, 发送信号量通知发送线程重新发送.
在该框架处理过程中, 遇到 的问题:
1.客户端向 服务器发送数据过程中, (如1000张图片), 发送至一半, 服务器会出现解析数据包错误;
查找问题思路: 1.1 在处理线程组完数据包后, 对该数据包进行判断, 是否正确;
1.2 发送线程中, 发送数据前, 再对数据包进行判断, 是否正确; (发现此时 有的数据包会出错 )
1.3 接收线程中, 接收应答成功后, 准备删除 数据前, 再对将删除的数据包进行判断, 是否正确;
1.4 将服务器接收的包进行解析, 查看其中的内容, 与上述几个过程中的 解析数据进行对比.
解决思路: 1.是否为信号量在 几个线程间不同步造成的; (发现不是, 一直以为是此处的问题, 浪费了老长时间)
2. 看是否为多线程的 共享资源被污染; 上述使用的 队列,链表,都为全局共享资源, 果然是此处问题, 队列中储存的 内存块地址被 线程2 与 线程4 互相争抢,造成污染;
数据被修改, 导致服务器接收的数据不正确, 崩溃...
爬坑的深刻体会: 多线程, 共享资源一定, 一定, 一定 要加锁... 即使有其他的同步手段, 加锁也更保险.