我正在使用Pthreads编写一个Web服务器(我吮吸它)(我甚至更多),我就陷入困境.服务器的模型是boss-worker,因此boss线程在程序开始时实例化所有工作线程.存在一个全局队列,用于存储传入连接的套接字.boss线程是在接受连接时将所有项(套接字)添加到队列的线程.然后,所有工作线程等待将项目添加到全局队列,以便它们接受处理.
只要连接服务器的次数少于服务器拥有的工作线程数,服务器就可以正常工作.因此,我认为我的互斥体出现问题(可能信号丢失了?)或线程在运行一次后被禁用(这可以解释为什么如果有8个线程,它只能解析第一个8个http请求).
这是我的全局队列变量.
int queue[QUEUE_SIZE];
Run Code Online (Sandbox Code Playgroud)
这是主线程.它创建一个队列结构(在其他地方定义),方法是enqueue,dequeue,empty等.当服务器接受连接时,它会将传入连接所在的套接字排入队列.在开始时调度的工作线程不断检查此队列以查看是否已添加任何作业,如果有作业,则它们将套接字出列,连接到该端口,并读取/解析/写入传入的http请求.
int main(int argc, char* argv[])
{
int hSocket, hServerSocket; /* handle to socket */
struct hostent* pHostInfo; /* holds info about a machine */
struct sockaddr_in Address; /* Internet socket address stuct */
int nAddressSize = sizeof(struct sockaddr_in);
int nHostPort;
int numThreads;
int i;
init(&head,&tail);
//**********************************************
//ALL OF THIS JUST SETS UP SERVER (ADDR STRUCT,PORT,HOST INFO, ETC)
if(argc < 3) {
printf("\nserver-usage port-num num-thread\n");
return 0;
}
else {
nHostPort=atoi(argv[1]);
numThreads=atoi(argv[2]);
}
printf("\nStarting server"); …Run Code Online (Sandbox Code Playgroud)