1. lws是单线程调度,从外部调用ws写,属于多线程竞争写操作,竞争的是写缓存buffer需要加互斥锁,防止临界资源-缓存buffer被破坏。每次写完缓存buffer,需要设置标志位,标识buffer的内容待发送,所有请求写操作,应该等待,这会影响执行效率。
2. 应该增加一个队列,把需要写的消息保存到队列中,然后发送写请求,写端从队列中获取消息实体发送。 *应该是每个client实例拥有一个队列,否则在ws线程中,如果被调度写的client,在队列顺序取的时候不是它的消息,则会错乱。
3. 如果是多个队列,每次消息发送,都需要申请节点内存,释放节点内存,如此频繁操作内存,也会导致效率降低。但是不会阻塞和出现消息错乱。
4. 如果是每个client的消息都是使用同一块内存,为了防止多线程被破坏,则每次请求写buffer的时候,都需要等待上次请求写完成,才能使用buffer,存在等待,有可能导致调用线程被阻塞,如果lws连续两次调度收到数据,使用互斥锁保护buffer,buffer内容会被覆盖,导致消息丢失,如果使用信号量,会出现死等,导致lws线程无法正常工作。
综上,选择每个连接实例拥有一个消息队列处理,在收消息的时候,把消息存放到一个后端消费队列中,在后端线程中处理。