我需要使用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(&amp; request)。当我打印输出时,应用程序不会崩溃,但是nginx会在错误文件中将错误“上游过早关闭FastCGI stdout,同时从上游读取响应头”。我不确定发生了什么事。也许它与FCGX_Request中的输出流是一个指针有关。
如果我取消注释该行
request = *NewRequest();
它能够打印响应,但如果我不能每次都重新初始化一个新请求,那么我就无法将它们存储在队列中。
我可以做些什么来将这些FCGX_Requests存储在队列中,以便处理另一个线程?感谢
答案 0 :(得分:3)
做这样的事情:
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;
}
完成后请不要忘记删除请求。