2012-09-06 21 views
0

我在我的KLM内部的Linux内核中有一些内核线程。
我有一个服务器线程,听通道,一旦它看到有一个传入的连接,它会创建一个接受套接字,接受连接并产生一个子线程。它还将接受的套接字作为(void *)参数传递给子内核线程。一个线程可以打开一个套接字而其他线程关闭吗?

该代码工作正常。我有一个设计问题。
现在假设线程必须被终止,主线程和子线程,关闭接受套接字的最好方法是什么。我可以看到两种方式,
1]主线程等待所有子线程退出,每个子线程在退出时关闭接受套接字,最后一个子线程将一个信号传递给主线程以退出。在这里,即使主线程是创建接受套接字的主线程,子线程也会关闭该套接字,并在主线程退出之前执行此操作。这是可以接受的吗?你们在这里遇到的任何问题?
2]其次是主线程关闭它在退出之前创建的所有接受套接字。但是可能有一种可能性(角落案例)主线程得到一个异常并且必须关闭,所以如果它在退出之前关闭了接受套接字,那么使用该套接字的子线程将处于危险之中。

因此,我正在使用我提到的第一个案例。让我知道你们是怎么想的?

+0

我很好奇儿童如何关闭他们的插座。它们是不是应该在读取操作中被阻塞,因此需要主线程关闭套接字才能解除封锁? – Tudor

回答

0

我更喜欢选项1,因为它是一个更清洁的解决方案:当一个特定的线程退出时,它清理它拥有的资源(线程拥有套接字,对吗?)。这样你就不会遇到像你提到的任何可能的角落案例,主线程关闭了一个可能在子线程中使用的套接字,等等。使用一个设计,其中一个子线程拥有套接字,并且是唯一一个读/写/关闭它很简单,干净,并且导致更高的凝聚力。

第二个选项可以实现,以避免额外的逻辑和信号的角落情况,但它确实没有必要添加额外的复杂性。我总是喜欢使用KISS principle

至于你关于关闭在不同的线程关闭一个套接字的问题比它创建的地方:这里没有问题。文件描述符(对于套接字和其他实体)在整个过程中是唯一的。如果我们谈论分叉的流程,那么情况就不一样了。

0

首先关闭:对于套接字的“句柄”是一个整数,将整数移交给关闭函数将工作,而不管上下文。

关于你的设计..我会建议混合使用这两种版本.. 创建一个列表(你锁定,如果被访问的话)open socket并且!每个线程关闭它的socket并从主列表中移除它。 退出主线程后,关闭所有剩余的插座。 这样一个子线程+主线程将不得不在一个套接字被打开之前死亡,这应该是所有情况描述的最小概率。

相关问题