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函数之前崩溃时,该资源将永远丢失...这就是为什么我不会冒险让资源完全在客户端线程的控制之下的原因。
没有找到相关结果
已邀请:
2 个回复
济畦刨
苦诫
),在这种情况下,指针将自动发送到析构函数。如果始终创建并销毁线程,则收集器线程仍可以调用“ 3”。但是也可以创建处于分离状态的线程,或在创建后调用
。 还要看看前面问过的类似问题。