2014.7.23 下午, 快5点, 苏州, 天气不错, 有很多的云.
让我想起了刚来苏州那一年, 也是在夏天, 与大家一块去苏州乐园玩的情意. 那天的天气和今天像极了. 但是心情却不一样了. 就像甄嬛说的, 这样的朝阳如同我们进宫那一年, 但心境却大不相同了.
今天下班后得去疾控中心打针, 上个月的某天晚上下班后, 在站台附近看到一只小猫, 大概两个月不到的样子, 走路颤颤巍巍的, 想把它带回家养, 谁知被它狠狠的咬了一口, 我满手都是血, 怕得狂犬病, 果断去打针, 今天是最后一针.
现在的服务器是用C++和lua写的, 都知道lua不支持多线程, 如果在多个线程中同时使用lua_State*的话, 那一定会崩溃的, 只是早晚的问题. 如果给每个调用lua_State的地方都加一个锁的话, 那多线程就变成单线程的了, 甚至还不如单线程, 因为这个锁来锁去的东西得切换线程. 加了锁, 变成了单线程, 那就没意义了; 没意义倒还在其次, 那并发起来的服务器, 单线程是扛不住的!
由于是在windows下面写的服务器, 我使用的网络模型是windows线程池. 它内部把IOCP给封装了一下, 其实就是用的IOCP. 每次响应消息的时候, 都是一个线程.
我现在的做法是做了一个lua_State的管理类. 用来分配和回收lua_State, 每次响应消息的时候呢就分配出一个lua_State给这个线程使用. 用完之后, 就又把这个lua_State给回收起来. 不是把lua_State给关了. 使用这种方式最重要的就是共享数据的问题. 我现在 将lua中的共享都提出来放到C++中了, lua就做逻辑处理吧您内!
现在想想, 多线程的部分完全没有必要用lua来写. 蛋疼!