繁体   English   中英

如何加入以正在运行的pthread数组结尾的pthread

[英]How to join pthread which ended from array of running pthread

我有一个用C ++编写的聊天服务器,我对phtreads有问题。 该服务器应该处理多个连接,因此我创建了pthread数组。 当新的客户端连接时,它将从数组中为该客户端提供一个pthread,并在通讯已完成的地方调用handle函数。 但是,当此客户端断开连接时,我不知道如何查找哪个pthread结束以及哪个pthread数组索引为空。 我知道这段代码很可怕,但是我真的想使这个程序更好

所以我的问题是我能这样做吗,当一个pthread结束时,我将为连接到潜在的下一个客户端的那个pthread数组清空该索引,而当有更多人说100个人连接时,我将重新分配该数组?

我如何找到哪个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);
    }
}   

我如何找到哪个pthread结尾于加入那个pthread并找到哪个索引现在可以再次自由使用?

pthreads API没有提供发现终止线程的方法。 Glibc具有不可移植的扩展,通过它您可以尝试对特定线程进行非阻塞连接(请参阅pthread_tryjoin_np() ),如果您可以使用它,则可以围绕它构建基于轮询的解决方案。

但是我想说,完成此任务的正确方法是为工作线程建立一种机制,以告知主线程它们已完成。 例如,他们可以将自己的线程ID添加到主线程也可以看到的链接列表中,然后发送信号或使用pthread_cond_signal()引起主线程的注意。 确保为多线程访问共享变量提供正确的同步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM