我有一个单线程 Web 服务器,它接受GET
或HEAD <filename> HTTP/1.0
请求并将文件数据返回给客户端。
pthread
我想使用库使其成为多线程。
request
具体来说,它为每个 GET 或 HEAD 请求创建一个类的实例,将其推送到队列中(用于 FIFO 处理,它应该能够用 apriority_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 函数?
我一直在研究这个并试图找出一个星期的解决方案,但这非常令人困惑。
请给我一些指导。
谢谢你。