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。

更多推荐