Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Nginx+;fastcgi多线程_C++_Multithreading_Nginx_Cgi_Fastcgi - Fatal编程技术网

C++ Nginx+;fastcgi多线程

C++ Nginx+;fastcgi多线程,c++,multithreading,nginx,cgi,fastcgi,C++,Multithreading,Nginx,Cgi,Fastcgi,您好,我一直在尝试制作fastcgi应用程序,我希望它是多线程的,这样它可以一次处理很多请求。我找到了代码,并对其进行了一些修改 FCGX_InitRequest(&request, 0, FCGI_FAIL_ACCEPT_ON_INTR); for (;;) { static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t counts_mutex = P

您好,我一直在尝试制作fastcgi应用程序,我希望它是多线程的,这样它可以一次处理很多请求。我找到了代码,并对其进行了一些修改

FCGX_InitRequest(&request, 0, FCGI_FAIL_ACCEPT_ON_INTR);

for (;;)
{
    static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER;
    static pthread_mutex_t counts_mutex = PTHREAD_MUTEX_INITIALIZER;
    pthread_mutex_lock(&accept_mutex);
    rc = FCGX_Accept_r(&request);
    pthread_mutex_unlock(&accept_mutex);

    ... ... ...


    FCGX_FPrintF(request.out,"%s",test_stream.str().c_str());

    FCGX_Finish_r(&request);
}
代码一直在接受上阻塞,所以实际上它会等待,直到请求完全完成

我试着像这样繁殖fastcgi

spawn-fcgi -p 8001 -U www-data -n handler.cgi -F 32
spawn-fcgi -p 8001 -U www-data -n handler.cgi -- /usr/bin/multiwatch -F 32

问题解决了。使用FCGX_OpenSocket和umask(0)让套接字接受。这将为您提供真正的多线程应用程序

#include <pthread.h> 
#include <sys/types.h> 
#include <stdio.h> 

#include "fcgi_config.h" 
#include "fcgiapp.h" 


#define THREAD_COUNT 8 
#define SOCKET_PATH "/var/run/myfcgiserver.sock" // your unix socket file

static int socketId; 

static void *doit(void *a) 
{ 
    int rc, i; 
    FCGX_Request request; 
    char *server_name; 

    if(FCGX_InitRequest(&request, socketId, 0) != 0) 
    { 
        printf("Can not init request\n"); 
        return NULL; 
    } 
    printf("Request is inited\n"); 

    for(;;) 
    { 
        static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER; 

        printf("Try to accept new request\n"); 
        pthread_mutex_lock(&accept_mutex); 
        rc = FCGX_Accept_r(&request); 
        pthread_mutex_unlock(&accept_mutex); 

        if(rc < 0) 
        { 
            printf("Can not accept new request\n"); 
            break; 
        } 
        printf("request is accepted\n"); 

        server_name = FCGX_GetParam("SERVER_NAME", request.envp); 

        FCGX_PutS("Content-type: text/html\r\n", request.out); 
        FCGX_PutS("\r\n", request.out); 
        FCGX_PutS("<html>\r\n", request.out); 
        FCGX_PutS("<head>\r\n", request.out); 
        FCGX_PutS("<title>FastCGI Hello! (multi-threaded C, fcgiapp library)</title>\r\n", request.out); 
        FCGX_PutS("</head>\r\n", request.out); 
        FCGX_PutS("<body>\r\n", request.out); 
        FCGX_PutS("<h1>FastCGI Hello! (multi-threaded C, fcgiapp library)</h1>\r\n", request.out); 
        FCGX_PutS("<p>Request accepted from host <i>", request.out); 
        FCGX_PutS(server_name ? server_name : "?", request.out); 
        FCGX_PutS("</i></p>\r\n", request.out); 
        FCGX_PutS("</body>\r\n", request.out); 
        FCGX_PutS("</html>\r\n", request.out); 

        FCGX_Finish_r(&request); 

    } 

    return NULL; 
} 

int main(void) 
{ 
    int i; 
    pthread_t id[THREAD_COUNT]; 

    FCGX_Init(); 
    printf("Lib is inited\n"); 
    umask(0);   
    socketId = FCGX_OpenSocket(SOCKET_PATH, 2000); 
    if(socketId < 0) 
    { 
           return 1; 
    } 
    printf("Socket is opened\n"); 


    for(i = 0; i < THREAD_COUNT; i++) 
    { 
        pthread_create(&id[i], NULL, doit, NULL); 
    } 

    for(i = 0; i < THREAD_COUNT; i++) 
    { 
        pthread_join(id[i], NULL); 
    } 

    return 0; 
}
#包括
#包括
#包括
#包括“fcgi_config.h”
#包括“fcgiapp.h”
#定义线程计数8
#定义套接字路径“/var/run/myfcgiserver.sock”//unix套接字文件
静态int-socketId;
静态void*doit(void*a)
{ 
int rc,i;
FCGX_请求;
字符*服务器名称;
if(FCGX_InitRequest(&request,socketId,0)!=0)
{ 
printf(“无法初始化请求\n”);
返回NULL;
} 
printf(“请求已初始化\n”);
对于(;;)
{ 
静态pthread\u mutex\u t accept\u mutex=pthread\u mutex\u初始值设定项;
printf(“尝试接受新请求\n”);
pthread_mutex_lock(&accept_mutex);
rc=FCGX\u接受请求(&r);
pthread_mutex_unlock(&accept_mutex);
if(rc<0)
{ 
printf(“无法接受新请求\n”);
打破
} 
printf(“请求被接受\n”);
server_name=FCGX_GetParam(“server_name”,request.envp);
FCGX_PutS(“内容类型:text/html\r\n”,request.out);
FCGX_put(“\r\n”,request.out);
FCGX_put(“\r\n”,request.out);
FCGX_put(“\r\n”,request.out);
FCGX_PutS(“FastCGI Hello!(多线程C,fcgiapp库)\r\n”,request.out);
FCGX_put(“\r\n”,request.out);
FCGX_put(“\r\n”,request.out);
FCGX_PutS(“FastCGI Hello!(多线程C,fcgiapp库)\r\n”,request.out);
FCGX_put(从主机接受请求),Request.out);
FCGX_PutS(服务器名称?服务器名称:“?”,request.out);
FCGX_put(“

\r\n”,request.out); FCGX_put(“\r\n”,request.out); FCGX_put(“\r\n”,request.out); FCGX_完成_r(&请求); } 返回NULL; } 内部主(空) { int i; pthread_t id[线程计数]; FCGX_Init(); printf(“Lib已初始化\n”); 乌马斯克(0); socketId=FCGX_OpenSocket(SOCKET_路径,2000); if(socketId<0) { 返回1; } printf(“套接字已打开\n”); 对于(i=0;i
能否添加一个示例nginx.conf文件?