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

本文探讨了因Epoll_wait与事件处理线程不同步导致的并发问题,并提出了一种解决方案:通过压缩event_type和fd到8字节空间,并利用hash_tbl作为线程间通信管道来确保事件的唯一性和有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  昨天有点事耽误了... 今天又接着改造... , 在改造的时候遇到了一个之前就曾经发生的问题: 因为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的唯一有效不重复.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值