fastcgi multithreading
От: iHomer  
Дата: 27.04.11 09:19
Оценка:
Друзья,
подскажите, в fcgilib со связкой с lighttpd возможно сделать мультипотоковую обработку запроса ?
Т.е. такой код:
#include <string>
#include <iostream>
#include "fcgi_stdio.h"

#include <boost/thread.hpp>

boost::mutex acc_m, pr_m;

struct f
{
    int id;
    FCGX_Request request;

    f(int _id, FCGX_Request _request) : id(_id), request(_request) {}

    void operator() ()
    {
        int reqCounter = 0;

        int acc = 1;
        {
            boost::mutex::scoped_lock a(acc_m);
            acc = FCGX_Accept_r(& request);
        }

        while(! acc)
        {
            reqCounter ++;
            {
                boost::mutex::scoped_lock a(pr_m);
                FCGX_FPrintF(request.out,
                    "Set-Cookie: AA=123-3232-434ffds3\r\n"
                    "Content-type: text/html\r\n"
                    "\r\n"
                    "<b>%d</b><br>%d", reqCounter, id); 

                FCGX_Finish_r(&request);
            }

            {
                boost::mutex::scoped_lock a(acc_m);
                acc = FCGX_Accept_r(& request);
            }
        }
    }
};

int main(int argc, char * const argv[])
{
    if(FCGX_Init())
        exit(1);

     int listen_socket = FCGX_OpenSocket(":5329", 400);
     if(listen_socket < 0)
        exit(1);

     FCGX_Request request;
     if(FCGX_InitRequest(& request, listen_socket, 0))
         exit(1);

     boost::thread_group th;
     th.create_thread(f(0, request));
     th.create_thread(f(1, request));

     th.join_all();

     return 0;
}


Сомнения в том, что Accept_r принимает запрос из сокета от одного клиента в один поток,
а от второго клиента во второй поток.
Но если придется ответ в сокет из потоков в обратном порядке, т.е. сначала второй поток, затем первый.
То веб сервер отправит ответ не тому клиенту ?
Re: fastcgi multithreading
От: _Artem_ Россия  
Дата: 28.04.11 10:25
Оценка:
Здравствуйте, iHomer, Вы писали:

H>Сомнения в том, что Accept_r принимает запрос из сокета от одного клиента в один поток,

H>а от второго клиента во второй поток.
H>Но если придется ответ в сокет из потоков в обратном порядке, т.е. сначала второй поток, затем первый.
H>То веб сервер отправит ответ не тому клиенту ?

Автор что-то ты напутал, эти серверы пишут немного не так:

    while (FCGX_Accept(&in, &out, &err, &envp) >= 0) {

А дальше in и out передаются в потоки. Таким образом каждый поток будет работать со своим in/out
Re[2]: fastcgi multithreading
От: iHomer  
Дата: 28.04.11 11:47
Оценка:
Здравствуйте, _Artem_, Вы писали:

_A_>Здравствуйте, iHomer, Вы писали:


H>>Сомнения в том, что Accept_r принимает запрос из сокета от одного клиента в один поток,

H>>а от второго клиента во второй поток.
H>>Но если придется ответ в сокет из потоков в обратном порядке, т.е. сначала второй поток, затем первый.
H>>То веб сервер отправит ответ не тому клиенту ?

_A_>Автор что-то ты напутал, эти серверы пишут немного не так:


_A_>
_A_>    while (FCGX_Accept(&in, &out, &err, &envp) >= 0) {
_A_>

_A_>А дальше in и out передаются в потоки. Таким образом каждый поток будет работать со своим in/out

Автор не напутал,
для работы fastcgi через tcp, нужно его как минимум открыть int listen_socket = FCGX_OpenSocket(":5329", 400);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.