libwebsockets的SMB 多线程
libwebsockets内在支持SMB多线程。它的用法很简单,在源码包中,有个实例可以参考:minimal-http-server-eventlib-smp.c。
在lws_context_creation_info结构体中,有两个成员用于说明启用SMB线程模型。
- unsigned int count_threads;
- unsigned int fd_limit_per_thread;
它们的缺省值为0,表示使用单线程。设置count_threads值为n,告诉LWS你有几个服务线程同时作用于context。无论起多少个线程,socket的监听依然是集中在一个线程下的。当连接建立时,会有一个线程accept新的连接,基于连接做负载均分。
用户代码负责为服务线程关联一个特定的tsi(tsi作为线程索引,值从0到n-1)。如果fd_limit_per_thread值设置为0,那么进程的fd打开限制值将作为SMB线程的共享值。假设其值为1024,那么每个线程最多打开1024/n个fd。用户侧可以设fd_limit_per_thread为非0值。
编译时,你必须设置宏LWS_MAX_SMP,即
cmake -DLWS_MAX_SMP=8
如果没有设置这个宏,它将设置为1。它会关联到很多线程安全相关的代码。
实际上能支持的线程数和LWS_MAX_SMP有关,并不是count_threads设置多少就是多少。LWS提供了一个API,lws_get_count_threads(context),它用于查询实际支持的线程数。
SMP线程锁
如果编译时,LWS_MAX_SMP==1,那么,LWS库不会实例化锁。如果LWS_MAX_SMP大于1,那么,LWS会有锁对象来保证LWS对象的线程安全。
因此,如果要使用SMB,编译时一定要记得设置LWS_MAX_SMP。
更多推荐


所有评论(0)