0.背景
在项目中加入了等待通讯的内容,所以原来单个请求处理时间增加了。单线程处理的fcgi就会浪费CPU和用户时间,所以需要多线程来处理,减少用户排队时间。
将处理用户请求的部分从单线程变为多线程,需要大概了解改动会不会影响性能。
得到的结论是:多线程和单线程在执行的流程和使用方法几乎一样,所以多线程不会带来额外的负担。
1.单线程的处理步骤
1.1一个简单的单线程fcgi请求
#include <fcgi_stdio.h> void main(void) { int count = 0; while(FCGI_Accept() >= 0) { printf("Content-type: text/html\r\n"); printf("\r\n"); printf("Hello world!<br>\r\n"); printf("Request number %d.", count++); } exit(0); }
1.2进入FCGI_Accept。
进入这个 FCGI_Accept() 方法里面,在文件fcgi_stdio.c里。
int FCGI_Accept(void) { //变量表示是否接收请求。默认为Fasle,不接收请求 if(!acceptCalled) { //判断是否为cgi,变量为全局静态的,下次还会用。 isCGI = FCGX_IsCGI(); //状态改为接收请求。 acceptCalled = TRUE; //请求的收尾,将数值清空赋初值。 atexit(&FCGI_Finish); } else if(isCGI) { //不是第一次请求,并且是cgi程序。 return(EOF); } if(isCGI) { //cgi的初始赋值操作,不关心。 ... } else { FCGX_Stream *in, *out, *error; //char** 字符串数组。 FCGX_ParamArray envp; //接受请求,这个方法下面介绍 int acceptResult = FCGX_Accept(&in, &out, &error, &envp); //接收失败,返回<0,这也