【发布时间】:2026-01-03 23:45:02
【问题描述】:
我正在努力在 C 中设计一个多线程 Web 服务器 - 目标是拥有一个老板/工人模型,老板初始化队列、主套接字等,然后进入一个循环,它接受新的连接并入队新工作人员队列中的新套接字描述符。
!!!!编辑:我收到了一些有用的反馈,感觉我几乎可以实现链接列表了。但是我在这里仍然缺少一些东西。当我使用示例客户端运行服务器时,它不能正常工作(从不开始发送文件或显示输出)
要清楚,我有以下作为全局变量
ptreads.h
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t c_boss = PTHREAD_COND_INITIALIZER;
pthread_cond_t c_worker = PTHREAD_COND_INITIALIZER;
队列结构:
//QUEUE STRUCTURE
struct Node {
int data ;
struct Node * next; // or link
};
struct Node* front = NULL;
struct Node* rear = NULL;
void Enqueue(int x){
details
}
void Dequeue(){
details
}
主要:
ServerSocket = socket(AF_INET, SOCK_STREAM, 0);
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(HostPort);
bind(ServerSocket, (struct sockaddr *)&server, sizeof(server));
listen(ServerSocket, max_pending_connections)
pthread_t tid[numThreads];
int i;
for(i = 0; i <numThreads; i++){
pthread_create(&tid[i], NULL, thread, NULL);
}
while(1)
while(front==NULL)
{
pthread_cond_wait (&c_boss, &mtx);
}
pthread_mutex_lock(&mtx);
enqueue(client_sock);
pthread_mutex_unlock(&mtx);
pthread_cond_signal(&c_worker);
}
最后是工作线程:
void *thread(void * ServerSocket)
int peer_socket = *(int *) ServerSocket; // copy the socket
{
while(1){
pthread_mutex_lock(&mtx);
while (front == NULL){
pthread_cond_wait(&c_worker, &mtx);}
peer_socket = Dequeue;
pthread_mutex_unlock(&mtx);
pthread_cond_signal(&c_worker);
DOES WORK
close(fd); // close the file
close(peer_socket); // close the client connection
pthread_exit(NULL);
【问题讨论】:
标签: c multithreading sockets queue threadpool