我有一个用c ++编写的聊天服务器,我遇到了phtreads的问题。 这个服务器假设处理多个连接,所以我创建了pthread数组。当一个新客户端连接时,它会从该数组向该客户端提供一个pthread并调用handle函数,其中comunication inplemented。但是当这个客户端断开时,我不知道如何找到哪个pthread结束以及哪个pthread数组的索引为空。我知道这段代码很糟糕,但我真的想让这个程序更好
所以我的问题是,我可以这样做,当一个pthread结束时,我会将该索引清空为pthread数组,用于潜在的下一个客户端连接,当更多可以说100个人连接时,我将重新分配数组吗? / p>
我如何找到哪个pthread结束加入该pthread并找到哪个索引现在可以再次使用?
struct parsing{
int socket;
};
int i = 0;
int strop = 100;
pthread_t *thread;
thread = (pthread_t*)malloc(sizeof(pthread_t)*100);
struct parsing args;
while (1)
{
if((client_sock = accept(socket_desc, (struct sockaddr *)&socket_addr, (socklen_t *)&client_sock_len)) < 0)
{
fprintf(stderr,"Accept Error");
return 5;
}
printf("connected %d",client_sock);
args.socket = client_sock;
pthread_create(&thread[i], NULL, &handle_connection, (void *)&args);
i++;
if (i == strop)
{
strop = strop + 100;
void * ptr = (pthread_t*)realloc(thread,sizeof(pthread_t)*strop);
}
}
答案 0 :(得分:0)
我如何找到哪个pthread结束加入该pthread并找到哪个索引现在可以再次使用?
pthreads API不提供发现已终止线程的方法。 Glibc有一个非可移植的扩展,您可以通过它来尝试特定线程的非阻塞连接(请参阅pthread_tryjoin_np()
),如果您可以使用它,那么您可以围绕它构建基于轮询的解决方案。 / p>
但我要说正确的方法是为工作线程建立一种机制,让告诉主线程完成它们。例如,他们可能会将自己的线程ID添加到主线程也可以看到的链表中,然后发送信号或使用pthread_cond_signal()
来引起主线程的注意。确保为共享变量的多线程访问提供适当的同步。