многопоточное приложение FastCGI

Я хочу написать приложение 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, и приложение обработало только один запрос за раз. Как я могу заставить мое приложение обрабатывать несколько запросов? Или это неправильный подход?

8
задан MarcS82 29 April 2011 в 08:37
поделиться