Akagi201
3/29/2016 - 9:29 AM

state-threads.md

ST 注意事项

  1. SRS/BMS 基于 ST(State Threads) 实现, 类似 golang 的一个轻量级线程库. 关于 ST:

  2. ST 启动后, fork 的进程中不能再使用 ST. 这个是 ST 的 bug. 因此, 所有的伴生进程都是在 ST 启动之前启动, 避免进程启动触发 ST 的 bug.

  3. ST 是一个异步 IO 库, 所有的同步操作都必须不能阻塞, 譬如: DNS解析( BMS 使用伴生进程), 视频转码(通过调用 HTTP API), 磁盘 IO (目前没有处理). 也就是说, 所有的操作都要转换成 IO 等待, ST 的 IO 是异步的.

  4. ST 可以开启非常多的线程, 尽量开辟线程而不是使用状态机. 不用担心线程太多, ST 可以开启无限制的线程.

  5. 每个FD, 只能被一个线程管理. 譬如开启和关闭必须在一个线程, 多个线程同时管理一个 FD 会导致未知的问题. FD 的读写可以分离, 但是, 读只能一个线程, 写只能一个线程, 当然读写都是一个线程也没有问题, 多个线程同时读或写, 会导致未知的问题.

  6. 当出现奇怪的问题时, 大多都是 FD 的问题, 譬如线程切换导致重入, FD 被多个线程处理等等.