zoukankan      html  css  js  c++  java
  • 多线程开发中遇到的问题

    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 互相争抢,造成污染;

              数据被修改, 导致服务器接收的数据不正确, 崩溃...

           爬坑的深刻体会:  多线程, 共享资源一定, 一定, 一定 要加锁... 即使有其他的同步手段, 加锁也更保险.

            

      

      

  • 相关阅读:
    八步详解Hibernate的搭建及使用
    Hibernate的介绍
    javascript的优缺点和内置对象
    过滤器有哪些作用?
    JSP中动态INCLUDE与静态INCLUDE的区别?
    jsp的四种范围?
    jsp有哪些动作作用分别是什么?
    介绍在JSP中如何使用JavaBeans?
    jsp有哪些内置对象作用分别是什么 分别有什么方法?
    request.getAttribute() 和 request.getParameter() 有何区别?
  • 原文地址:https://www.cnblogs.com/yyx1-1/p/6531125.html
Copyright © 2011-2022 走看看