一 多线程间通信的问题
多线程间通信的问题 本质上就是, 一个线程负责维护一个变量/结构体, 另外的一个(多个)线程读取这个变量结构体的内容
eg: 线程A维护结构体struA, 线程B需要不断的读取struA的内容
多线程间通信时, 编码面临最大的问题在于 读取的信息不一致, 读脏数据的问题
方式1: 通过直接访问全局变量
该方式,最危险, 可能发送A修改全局变量, 修改了一半, B开始读了. B读到的数据内部状态不一致
方式2: 通过提供访问接口
该方式,仍然很危险, 好在, 可以通过较为方面的加入一些 EnterCriticalSection,来控制.
由于接口是有A提供的, A可以在需要修改struA, 读取struA的地方, 加入EnterCriticalSection.
如果采用方式1, 那么线程B也需要加入EnterCriticalSection的控制, 代码复杂度上升.
eg 主线程 GetUsbState() 查询USB线程的执行状态
由于UsbState是个很大的结构体, 而这个函数里面目前还没有加入enterCriticalSection的控制, 出现问题是迟早的事.
方式3: 通过发送消息/命令队列
这个方式, 本质上是, 线程A把完整的全局变量struA做了一个备份, 这样线程B通过备份避免了直接读struA. 也就避免了读脏数据的问题.
该方式的机制的关键在于, 线程A备份struA时, 要是一个原子的操作, 保证备份的是个完整的struA.
3.1 通过windows消息
widnows消息的局限在于, 参数有限, 携带的信息量有限
3.2 命令队列
xEyeEngine中很多大数据量的通信, 一些命令下发, 基本上都是通过这个方式运行的.
xEyeList的实现是个关键.
二 多线程间竞争的问题
多线程间竞争的问题 本质上就是, 两个/多个线程同时需要修改/维护一些全局变量
就像两个小伙子, 都想亲亲一个美女一样, 同时只能有一个人得逞.
两个人最好商量好谁先上, 要不然, 会发生两个人都去亲, 都没亲错地方尴尬场面.
暂时项目中还没有遇到这样的问题.
三 多线程间同步的问题
多线程间同步的问题 本质上就是, 两个线程相互依赖, 只有等A做完了某件事, 并通知B, B才能进展下去, 然后B再通知A, A再往下走...