Pthread_join():资源收集器:等待多个线程退出

|| 我正在使用cource的pthread对并发(多线程)服务器应用程序进行编程! 当我遇到pthread_join问题时,我的应用程序关闭了(伪代码):
/* Sheduler thread */
while (1) {

   c = get_client();
   r = get_resource();

   communication.c = c;
   communication.r = r;

   pthread_create( clnt_tid, null, clnt_fn, communication);
   resource_alloc_list_add(clnt_tid, r);

}

/* resources Collector thread */
while(!rs_alloc_list_is_empty()) {

   e = get_elt(rs_alloc);
   pthread_join(e.clnt_tid, retour);
   free_rs(e.r);
}
.........
问题在于,没有非阻塞的pthread_join调用-有一个但不是可移植的调用-并且pthread_join不能在流程编程中像wait()一样加入任何线程。因此,如果rsc_collector线程正在等待一个客户端线程退出以获取分配的资源,并且在此之前所有其他线程都退出了,则它们的资源将被阻止-并且调度程序线程无法为其他客户端提供服务-直到第一个线程终止了他的工作。 你能告诉我这个问题的可能解决方案吗? 编辑: 我将更具体一点,我正在编程一个本地资源管理系统(lrms)或远程程序执行系统,有三种不同的程序:客户端pg,服务器pg和调度程序pg,客户端与调度程序联系并等待调度程序pg为他分配一台空闲服务器,以便他可以在提交后在远程服务器上执行他的工作。调度的pg将把客户地址排入客户队列。另一方面,服务器pg向注册程序发送注册消息并等待作业,调度程序将服务器地址排队到资源队列中(因此,我的意思是资源是远程服务器,而不是系统分配给线程的资源)。 调度程序pg由三个主线程组成: main_thread:绑定在知名端口上的套接字列表。接收并排队需求和注册(换句话说,生产者) scheduler_thread:使用方,出队子地址获取服务器(出队服务器地址),创建客户端线程,保存客户端/服务器分配。并循环播放。 resource_collector线程:等待客户端线程终止以获取分配的资源。我强调[*]创建一个特定的线程来进行资源收集,因为这对于系统的正常运行非常重要。 注意 : 客户端线程获取资源(服务器)的副本而不是原始副本。 [*]如果我消除该线程,并让每个客户端释放其esource(远程服务器地址),那么在某些情况下,当某个客户端线程在调用free函数之前崩溃时,该资源将永远丢失...这就是为什么我不会冒险让资源完全在客户端线程的控制之下的原因。     
已邀请:
正如alexey之前所说,线程函数可以分配和释放其资源。如果需要一种可以处理取消的方法,也可以使用pthread_cleanup_push和pop。 您可以使用全局标志来告诉您线程是否仍处于活动状态。在创建线程之前将其设置为1,并在线程函数退出时将其设置为0。如果线程很多,请使用数组。只需测试变量以查看线程是否完成。 希望您的收集器线程不会持续旋转,这会消耗资源。 创建线程很慢。您可能希望永久保留少量线程,并让它们从队列中选择要执行的工作。没有工作时,他们应该等待信号。将工作添加到队列后,您可以发出希望唤醒的线程数,然后重新开始工作。这比为每个工作创建一个线程并在完成工作时销毁线程要快1000倍。     
我建议在退出线程中进行必要的清理,而不是在特殊的收集器线程中进行清理。具体来说,用“ 1”创建的线程本地数据可能在线程退出时具有关联的析构函数调用。该析构函数可以释放与线程关联的应用程序资源。最简单的方法是将一个指向资源的指针存储在线程特定的插槽中(请参见
pthread_set_specific()
),在这种情况下,指针将自动发送到析构函数。如果始终创建并销毁线程,则收集器线程仍可以调用“ 3”。但是也可以创建处于分离状态的线程,或在创建后调用
pthread_detach()
。 还要看看前面问过的类似问题。     

要回复问题请先登录注册