简单的多线程fastcgi应用程序总是崩溃

时间:2015-03-25 18:57:01

标签: c++ multithreading fastcgi

我正在尝试了解如何在多线程环境中正确使用FastCGI。但是,在编译时,该程序总是在Apache上产生Internal Server Error。我觉得我对FastCGI和Apache都不熟悉,无法诊断我的错误。

这个程序的一个简单的单线程等效工作非常好。

我正在使用带有标记g++

-std=c++11 -lfcgi++ -lfcgi -lpthread进行编译

以下是我正在使用的代码:

#include "fcgio.h"
#include <vector>
#include <ostream>
#include <istream>
#include <thread>
#include <mutex>

std::mutex accept_mutex;

#define THREAD_COUNT (10)

void respond(){
  FCGX_Request request;
  FCGX_InitRequest(&request, 0, 0);
  fcgi_streambuf cout_fcgi_streambuf(request.out);

  std::ostream cout(&cout_fcgi_streambuf);

  for(;;) {
    accept_mutex.lock();
    if (FCGX_Accept_r(&request) < 0)
      break;
    accept_mutex.unlock();
    cout << "Content-type: text/html\r\n"
      << "\r\n"
      << "<html>\n"
      << "  <head>\n"
      << "    <title>Testing!</title>\n"
      << "  </head>\n"
      << "  <body>\n"
      << "    <h1>Hello, World!</h1>\n"
      << "</body>\n"
      << "</html>\n";

    FCGX_Finish_r(&request);
  }

}

int main(){
  FCGX_Init();
  std::vector<std::thread> threads(THREAD_COUNT);
  for(int i = 0 ; i < THREAD_COUNT ; i++)
    threads[i] = std::thread(respond);
  for(auto & x : threads)
    x.join();

}

这是我在Apache错误日志中找到的错误:

[Wed Mar 25 00:22:10.693368 2015] [fcgid:warn] [pid 11386:tid 139946920691456] (104)Connection reset by peer: [client 10.0.2.2:63490] mod_fcgid: error reading data from FastCGI server
[Wed Mar 25 00:22:10.693396 2015] [core:error] [pid 11386:tid 139946920691456] [client 10.0.2.2:63490] End of script output before headers: home2.fcgi
[Wed Mar 25 00:22:13.695752 2015] [fcgid:error] [pid 11384:tid 139947238573952] mod_fcgid: process /home/web/web/home2.fcgi(27007) exit(communication error), get unexpected signal 6

1 个答案:

答案 0 :(得分:0)

我解决了问题,因为它出现在我的问题中。

我在ofstream循环之前创建了cout for(;;),当它应该在循环内创建时。

这是有道理的,因为每个单独的连接都有自己应该写入的流。

-

我对更大的多线程应用程序的问题仍然存在 - 在我的大型程序中,我正确地实例化了我的ofstream。在创建我的最小示例时,我犯了一个错误,恰好在Apache中有相同的错误日志。但是,我的错误似乎与我发布的问题无关,现在我首先要寻找实际创建错误的内容。