stuyou
2017-04-19 12:46
采纳率: 100%
浏览 747
已采纳

如何保证一个设备在某个时刻只被另外一个设备使用?

有多个子模块都要通过WIFI模块来发送数据,子模块发送数据的时间是随机的,而且WIFI模块
也会随机地接收收据,这样就有可能造成WIFI模块的使用竞争,请问如何解决这种竞争?

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • zhangsheng_1992 2017-04-20 02:25
    已采纳

    你可以模拟一下锁 在主进程中增加一个锁的变量 这个变量指向持锁的子模块 通过检测释放这个变量来实现

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • zhangsheng_1992 2017-04-19 13:14

    1.锁 持锁的可以访问wifi模块 没有的等待持锁的人释放
    2.队列 和排队一样 一个一个来处理 也就不会有两个顾客同时访问营业员了

    评论
    解决 无用
    打赏 举报
  • stuyou 2017-04-20 00:20

    锁是在进程中才能用的吧,我的程序只有一个主进程,怎么用锁?

    评论
    解决 无用
    打赏 举报
  • qwx309184 2017-04-20 10:27

    wifi模块发送数据部分使用线程安全的写队列,
    wifi接受到数据 解码 push 到读队列中

    别的模块发送数据 把数据push到写队列中,你的wifi模块 线程从写队列中读取数据 编码 内部发送出去
    我觉得出现这样的问题是框架设计的问题
    1 要保证wifi模块是否异步发送安全 如果能 直接把wifi模块 单例模式实现,比如写一个 WifiServer::senddata()别的模块发送数据调用这个函数 如果不能就用写队列实现
    2 框架 模块之间互相通讯机制 比如实现简单 框架 广播所有模块 单播一个模块 模块的启动 退出 执行某 任务 例如 实现一个event事件通知机制
    模块间通讯 通过event 发送
    比如 调度线程 发送一个event 结构体
    struct event
    {
    模块名称(这个可以是线程id 或者 自己随便定义)
    业务类型(具体的业务类型)
    优先级(业务的优先级 或者线程的优先级)
    业务数据
    }
    说白了就是一个观察者模式
    3 业务的理解 其实很多技术问题 本来不存在的 业务没有梳理好 只能在技术上弥补这个缺陷 平白无故增加许多技术负担,
    按照你的描述
    无非就是这样的场景
    1wifi模块接受数据 解码 通知其他模块 知道这个是什么数据包 什么业务 这个模块去处理
    2模块1处理完了 发送数据 wifi模块 直接发送数据出去
    给你参考的 意见
    1实现一个多模块的观察者模式 事件通知框架
    2 用回调 或者 用线程安全的 信号 槽库 c++ boost signal2库 或者其他的信号库 去实现

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题