Godbach 发表于 2016-05-25 16:11

回复 9# mordorwww
你都 close 掉了,为什么会越来越多。 socket 没有别的引用,自然就被系统释放了。

如果是 server 处理太慢,导致 socket 越来越多。那是应用程序的问题。


不清楚你到底担心的是什么。


   

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

本帖最后由 mordorwww 于 2016-05-25 16:31 编辑

Godbach 发表于 2016-05-25 16:11 static/image/common/back.gif
回复 9# mordorwww
你都 close 掉了,为什么会越来越多。 socket 没有别的引用,自然就被系统释放了。

...

因为所有线程共享files_struct, 所以别的线程也在引用这个socketfd,进而引用这个socket,进而引用这个tcp连接,
如果只是一个线程close(socketfd), 你内核如何判断其它线程不会继续使用这个socketfd,这个socket?

所以这个socket和tcp连接close一次会释放么?

daili0703 发表于 2016-05-25 17:17

{:qq11:} {:qq11:} {:qq11:} 回复 2# Godbach


   

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

回复 12# mordorwww

因为所有线程共享files_struct, 所以别的线程也在引用这个socketfd,进而引用这个socket,

回到你最开始的问题了,多线程之间是操作同一个 fd,是需要互斥操作而已。

也就是说,线程要 close fd 的时候,那么他要明确,别的线程没有关闭这个 fd,也没有线程正在关闭这个 fd。这个是线程同步的逻辑。和你担心的不是一回事儿。



   

mordorwww 发表于 2016-05-25 17:29

本帖最后由 mordorwww 于 2016-05-25 17:43 编辑

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





我觉得是引用计数
当线程不访问这个fd的时候,虽然没有加锁,你也不能删除这个fd和对用的socket,因为线程可能后面又会访问这个fd

Godbach 发表于 2016-05-25 17:56

回复 15# mordorwww

再次说明,这是应用程序应该处理好的逻辑,要做好互斥。

为什么会存在一个线程都要 close socket 了。另外一个线程还拿着这个 socket,还有可能有别的操作呢?

   

mordorwww 发表于 2016-05-25 18:00

本帖最后由 mordorwww 于 2016-05-25 18:10 编辑

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

再次说明,这是应用程序应该处理好的逻辑,要做好互斥。



不对不对,内核肯定不能对应用程序的逻辑做这样的假设和限制
而且锁和引用是两个东西,锁是保证你并发访问的一致性,而引用是决定是否能删除,没有锁并不表示能删除
感觉你是不是把这两个东西混淆了?

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

回复 17# mordorwww

那看下代码吧。


   

流氓无产者 发表于 2016-05-26 09:40

mordorwww 发表于 2016-05-25 16:31 static/image/common/back.gif
因为所有线程共享files_struct, 所以别的线程也在引用这个socketfd,进而引用这个socket,进而引用这个 ...
一般一个socket()对应一个close()
多线程共同使用同一个socket,引用没增长
但是一般不这样用,因为要考虑并发互斥socket

mordorwww 发表于 2016-05-26 09:54

流氓无产者 发表于 2016-05-26 09:40 static/image/common/back.gif
一般一个socket()对应一个close()
多线程共同使用同一个socket,引用没增长
但是一般不这样用,因为要 ...

我看了代码,多线程是引用file_struct数组,不是引用单个file_struct,似乎一个线程关闭了file_struct,这个file_struct也就删除了
页: 1 [2] 3
查看完整版本: 多线程网络程序关闭socket是否需要每个线程都关闭一下?