Я хочу написать приложение FastCGI, которое должно обрабатывать несколько одновременных запросов с использованием потоков. Я взглянул на образец Threadaded.c , который поставляется с SDK:
#define THREAD_COUNT 20
static int counts[THREAD_COUNT];
static void *doit(void *a)
{
int rc, i, thread_id = (int)a;
pid_t pid = getpid();
FCGX_Request request;
char *server_name;
FCGX_InitRequest(&request, 0, 0);
for (;;)
{
static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t counts_mutex = PTHREAD_MUTEX_INITIALIZER;
/* Some platforms require accept() serialization, some don't.. */
pthread_mutex_lock(&accept_mutex);
rc = FCGX_Accept_r(&request);
pthread_mutex_unlock(&accept_mutex);
if (rc < 0)
break;
server_name = FCGX_GetParam("SERVER_NAME", request.envp);
FCGX_FPrintF(request.out,…
…
FCGX_Finish_r(&request);
}
return NULL;
}
int main(void)
{
int i;
pthread_t id[THREAD_COUNT];
FCGX_Init();
for (i = 1; i < THREAD_COUNT; i++)
pthread_create(&id[i], NULL, doit, (void*)i);
doit(0);
return 0;
}
В спецификации FastCGI есть объяснение, как веб-сервер будет определять количество подключений. поддерживается приложением FastCGI:
Веб-сервер может запрашивать определенные переменные в приложении. В сервер обычно выполняет запрос при запуске приложения, чтобы автоматизировать определенные аспекты системы конфигурация.
…
• FCGI_MAX_CONNS: максимальное количество одновременных транспортных соединений это приложение примет, например, "1" или «10».
• FCGI_MAX_REQS: максимальное количество одновременных запросов это приложение примет, например, "1" или «50».
• FCGI_MPXS_CONNS: «0», если это приложение не мультиплексируется соединения (т.е. обработка одновременных запросов по каждому соединению), "1" в противном случае.
Но возвращаемые значения для этого запроса жестко закодированы в FastCGI SDK и возвращают 1 для FCGI_MAX_CONNS и FCGI_MAX_REQS и 0 для FCGI_MPXS_CONNS. Таким образом, образец threadaded.c никогда не получит несколько подключений.
Я тестировал образец с помощью lighttpd и nginx, и приложение обработало только один запрос за раз. Как я могу заставить мое приложение обрабатывать несколько запросов? Или это неправильный подход?