【问题标题】:FastCGI c++ store requests?FastCGI c++ 存储请求?
【发布时间】:2014-11-01 04:58:10
【问题描述】:

我需要使用 fastcgi 和 c++ 进行任何应用。与具有 FCGX_Accept_r(...) 循环的线程不同的线程是执行处理的线程,所以我希望我可以在请求进入队列时存储它们并让第二个线程在输出流上发送响应在每个请求中。 这是我目前得到的。

void Listen(){
    FCGX_Request request;
    FCGX_InitRequest(&request, 0, 0);
    while(FCGX_Accept_r(&request)>= 0)
    {
        AddRequest(request); //just adds it to a std::queue<FCGX_Request> queue
        request = *NewRequest();
    }
}

FCGX_Request* NewRequest()
{
    FCGX_Request* request;
    request = new FCGX_Request();
    FCGX_InitRequest(request, 0, 0);
    return request;
}

第二个线程只是检查队列中是否有东西(他们都共享它)。如果有请求,它会做任何事情,它应该打印响应并调用 FCGX_Finish_r(&request)。当我开始打印输出时,应用程序不会崩溃,但 nginx 会在错误文件中放置错误“上游过早关闭 FastCGI 标准输出,同时从上游读取响应标头”。我不确定发生了什么。可能与FCGX_Request中的输出流是一个指针有关。

如果我取消注释该行

request = *NewRequest();

它能够打印响应,但是如果我不能每次都将请求重新初始化为一个新的,那么我就不能将它们存储在队列中。

我可以做些什么来将这些 FCGX_Requests 存储在队列中以供另一个线程处理?谢谢

【问题讨论】:

    标签: c++ multithreading fastcgi


    【解决方案1】:

    做这样的事情:

    void Listen(){
        FCGX_Request *request = NewRequest();
        while(FCGX_Accept_r(request)>= 0)
        {
            // Make your queue hold pointers
            AddRequest(request); //just adds it to a std::queue<FCGX_Request*> queue
            request = NewRequest();
        }
    }
    
    FCGX_Request* NewRequest()
    {
        FCGX_Request* request = new FCGX_Request();
        FCGX_InitRequest(request, 0, 0);
        return request;
    }
    

    完成后不要忘记删除请求。

    【讨论】:

    • 每次添加后不需要request = new FCGX_Request?不都是同一个参考吗?
    • 是的,我一定是在睡觉。修正了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 2021-10-13
    • 2015-12-13
    相关资源
    最近更新 更多