mordorwww 发表于 2016-05-25 13:51

多线程网络程序关闭socket是否需要每个线程都关闭一下?

按照linux内核的设计,socket是所有线程共享的,如果这个进程有100个线程,那么关闭socket是不是要关闭100次

Godbach 发表于 2016-05-25 14:42

回复 1# mordorwww
应该是不需要的。只是你需要一个明确的设置,让别人知道这个 socket 已经不可用。比如简单粗暴的做法,设置 fd = -1.


   

mordorwww 发表于 2016-05-25 14:45

Godbach 发表于 2016-05-25 14:42 static/image/common/back.gif
回复 1# mordorwww
应该是不需要的。只是你需要一个明确的设置,让别人知道这个 socket 已经不可用。比如 ...

除了本身标记不可用外, 关键是socket占用的资源要释放啊,包括文件句柄和对应的数据结构, socket数据结构, 协议栈对应的数据结构(例如PCB协议控制块)

Godbach 发表于 2016-05-25 15:01

回复 3# mordorwww

多线程共享的是 fd,只是大家都通过同一个 fd 进行一些操作。底层的 socket 资源应该是一份。close 掉了就木有了。




   

mordorwww 发表于 2016-05-25 15:13

Godbach 发表于 2016-05-25 15:01 static/image/common/back.gif
回复 3# mordorwww

多线程共享的是 fd,只是大家都通过同一个 fd 进行一些操作。底层的 socket 资源应该 ...

       process, are removed (regardless of the file descriptor that was used to obtain the lock).

       If fd is the last file descriptor referring to the underlying open file description (see open(2)), the resources associated with the open file description are freed; if thedescriptor
       was the last reference to a file which has been removed using unlink(2) the file is deleted.


那么socket怎么关闭呢,怎么关闭tcp连接呢,我看了一些资料,使用close关闭应该不太好弄,那样的话,每个线程都要close 一次, 可能要用shutdown

Godbach 发表于 2016-05-25 15:21

回复 5# mordorwww

直接 close 就可以的。只是内核里面会根据引用计数确定是否真的释放掉。

所谓引用计数的问题,我的理解是,父子进程基于继承关系,会对底层的同一个 socket 的底层资源有多次引用。而多线程只是大家都可以操作同一个 fd,不存在多次引用底层资源。


   

mordorwww 发表于 2016-05-25 15:31

Godbach 发表于 2016-05-25 15:21 static/image/common/back.gif
回复 5# mordorwww

直接 close 就可以的。只是内核里面会根据引用计数确定是否真的释放掉。


问题是我总要关闭tcp连接,关闭socket。如果进程里有100个线程,在像http server这样的东西里面,不断地有新的tcp socket产生,你必须即时关闭不用的socket,释放她的资源。

如果只是减少socket引用计数,那是不行的说。

Godbach 发表于 2016-05-25 15:33

回复 7# mordorwww

你的一个 socket 要交给多个线程处理吗。 应用态应该做好逻辑,该关闭 socket 就关闭就行了,引用计数是内核态要考虑的逻辑。


   

mordorwww 发表于 2016-05-25 15:37

Godbach 发表于 2016-05-25 15:33 static/image/common/back.gif
回复 7# mordorwww

你的一个 socket 要交给多个线程处理吗。 应用态应该做好逻辑,该关闭 socket 就关闭 ...

这样没用的tcp连接可能会越来越多,没用的socket也会越来越多, 虽然你有关闭socket句柄的操作

gaojl0728 发表于 2016-05-25 15:50

100个线程 不需要关闭100次,关闭一次就好了。
页: [1] 2 3
查看完整版本: 多线程网络程序关闭socket是否需要每个线程都关闭一下?