网络负载平衡改造(续2)

  昨天有点事耽误了... 今天又接着改造... , 在改造的时候遇到了一个之前就曾经发生的问题: 因为epoll_wait和event处理使用2个不同的线程, 这就导致了, 有可能出现, 当event处理线程释放该connection, 但是epoll_wait线程已经获取了该event通知, 并压入event处理线程, 当event处理线程再次处理该事件时, 会访问非法空间一致崩溃 ...

 

  想了半天, 终于有了一个好想法, 因为现在所有的事件都有一个event_type, 但其容量很小, 这样就可以将event_type和fd(或vfd)压缩在一个8字节空间内, 牺牲1个字节作为event_type, 已经非常满足需求, 而event处理线程在拿到event时, 会先根据类型取出fd(或vfd), 查看其有效性, 并继续执行.

  这样就可以解决这种很尴尬的并发问题 :)

 

  不过, 还需要额外注意一个问题, 系统中现在有两种event, 一种是用户读事件, 一种是timer事件, 这里我采用hash_tbl作为线程之间的管道, 这是为了防止epoll_wait返回的事件具有重复性, 所以保证管道里的事件具有唯一性, 需要采用K-V方式进行控制, 这样KEY的选取就需要保持一致性, 现在考虑的策略就是采用统一的VFD生成管理器生成该KEY, 从而保证KEY的唯一有效不重复.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章