多线程开发中遇到的问题
来源:互联网 发布:海洋cms对比苹果cms 编辑:程序博客网 时间:2024/06/05 04:11
大体框架如下:
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 互相争抢,造成污染;
数据被修改, 导致服务器接收的数据不正确, 崩溃...
爬坑的深刻体会: 多线程, 共享资源一定, 一定, 一定 要加锁... 即使有其他的同步手段, 加锁也更保险.
- 多线程开发中遇到的问题
- JNIk开发过程中遇到的多线程处理问题
- 开发中遇到MFC多线程问题求解!!!!
- 开发中遇到的问题
- 开发中遇到的问题
- 开发中遇到的问题
- 开发中遇到的问题
- 开发中遇到的问题
- 开发中遇到的问题
- 开发中遇到的问题
- 开发中遇到的问题
- 开发中遇到的问题
- 开发中遇到的问题
- 开发中遇到的问题
- 多线程编程中遇到的问题总结
- 多线程遇到的问题
- Java中在学习多线程中遇到的问题
- NOTES开发中遇到的问题
- (转)Material适配详解
- DHCP(动态主机配置协议)工作流程
- C语言实现http get请求程序
- Linux 设置IP,gate, 以及自动获取IP的方法
- google vr 入门之制作简易的VR播放器及去除界面控制按钮
- 多线程开发中遇到的问题
- Linux中网络通信中 使用的结构体
- Linux 关机 休眠, 关闭移动设备自动挂载 命令
- build 与 clean
- 基于Linux的USB 主/从设备之间通讯的三种方式
- 从上往下打印二叉树
- USB协议及认知
- SIM800系列模块GSM/GPRS建立TCP连接到远端服务器过程
- 【解题报告】Vijos1143 三取方格数