如何使Web服务器程序变得多线程

时间:2013-10-30 17:52:01

标签: c++ multithreading http pthreads

我有一个单线程Web服务器,接受GETHEAD <filename> HTTP/1.0个请求,并将文件数据返回给客户端。

我想使用pthread库使其成为多线程。

具体来说,它为每个GET或HEAD请求创建一个request类的实例,将其推送到队列(用于FIFO处理,它应该能够做同样的事情改为使用priority_queue,可选)。

执行时,选择要执行的 request类,并同时处理请求。

因此,应该有一个调度线程,它从就绪队列中选择一个请求并将其调度到一个执行线程,以及一个排队线程,其中负责监听传入的HTTP请求并将其插入就绪队列,最后有两个以上执行线程执行请求。

我想到的全局是:

(This is pseudocode)

int main{

    queue q; //shared variable

    while(true) {

        pthread_t qt, st, et1, et2;

        request rq1, rq2;
        //create, bind, accept socket

        pthread_create(qt, ... , some_queuing_function , queue); //listen and queue the request

        pthread_create(st, ... , some_scheduling_function, queue);  //select a request from the queue, assign it to rq1 and rq2(using a shared variable, increment the index of request to be selected if executing threads are not full?)

        pthread_create(et1, ... , some_executing_function, rq1);

        pthread_create(et2, ... , some_executing_function, rq2);

        pthread_join(...);
        pthread_join(...);
        pthread_join(...);
        pthread_join(...);
    }

}

void * some_scheduling_function() { ... with mutex on queue }
void * some_queuing_function() { ... with mutex on queue }
void * some_executing_function() { ... }

这是我第一次使用pthread或其他任何库进行多线程处理,所以我对此并不了解。

我不确定这种设计是否有效,因为它太简单了。

我不确定函数的分区是否正确,顺序是否正确,或者结构是否正确。

特别是,在执行线程向所有执行线程分配请求并且所有执行线程执行所有请求之后,它们如何返回?

此外,是否需要排队和调度所需的pthread_join函数?

我一直在研究这个并尝试找出解决方案一周,但这非常令人困惑。

请给我一些指导。

谢谢。

0 个答案:

没有答案