libwebsockets 服务器线程模型理解

1. lws是单线程调度,从外部调用ws写,属于多线程竞争写操作,竞争的是写缓存buffer需要加互斥锁,防止临界资源-缓存buffer被破坏。每次写完缓存buffer,需要设置标志位,标识buffer的内容待发送,所有请求写操作,应该等待,这会影响执行效率。

2. 应该增加一个队列,把需要写的消息保存到队列中,然后发送写请求,写端从队列中获取消息实体发送。 *应该是每个client实例拥有一个队列,否则在ws线程中,如果被调度写的client,在队列顺序取的时候不是它的消息,则会错乱。

3. 如果是多个队列,每次消息发送,都需要申请节点内存,释放节点内存,如此频繁操作内存,也会导致效率降低。但是不会阻塞和出现消息错乱。

4. 如果是每个client的消息都是使用同一块内存,为了防止多线程被破坏,则每次请求写buffer的时候,都需要等待上次请求写完成,才能使用buffer,存在等待,有可能导致调用线程被阻塞,如果lws连续两次调度收到数据,使用互斥锁保护buffer,buffer内容会被覆盖,导致消息丢失,如果使用信号量,会出现死等,导致lws线程无法正常工作。

综上,选择每个连接实例拥有一个消息队列处理,在收消息的时候,把消息存放到一个后端消费队列中,在后端线程中处理。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值