一个线程可以打开一个套接字而其他线程可以关闭吗?

时间:2012-09-06 04:20:02

标签: c linux multithreading

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

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

因此我使用了我提到的第一个案例。让我知道你们的想法吗?

2 个答案:

答案 0 :(得分:0)

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

可以实施第二个选项,以避免带有额外逻辑和信号的极端情况,但实际上没有必要增加额外的复杂性。我总是喜欢使用KISS principle

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

答案 1 :(得分:0)

首先关闭:套接字的“句柄”是一个整数,无论​​上下文如何,将整数移交给close函数都将起作用。

关于你的设计......我建议两种版本混合使用.. 创建一个打开套接字的列表(当然是在被访问时锁定)并且每个线程关闭它的套接字并将其从主列表中删除。 退出主线程后,关闭所有剩余的套接字。 这样一个子线程+主线程将在套接字保持打开之前死掉,这应该是描述所有情况的概率最小的。