Друзья,
подскажите, в 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 принимает запрос из сокета от одного клиента в один поток,
а от второго клиента во второй поток.
Но если придется ответ в сокет из потоков в обратном порядке, т.е. сначала второй поток, затем первый.
То веб сервер отправит ответ не тому клиенту ?
Здравствуйте, iHomer, Вы писали:
H>Сомнения в том, что Accept_r принимает запрос из сокета от одного клиента в один поток,
H>а от второго клиента во второй поток.
H>Но если придется ответ в сокет из потоков в обратном порядке, т.е. сначала второй поток, затем первый.
H>То веб сервер отправит ответ не тому клиенту ?
Автор что-то ты напутал, эти серверы пишут немного не так:
while (FCGX_Accept(&in, &out, &err, &envp) >= 0) {
А дальше in и out передаются в потоки. Таким образом каждый поток будет работать со своим in/out
Здравствуйте, _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);