免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yuangong
打印 上一主题 下一主题

请教:多线程同时写socket是否需要加锁 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-08-30 10:01 |只看该作者
在TCP/TP卷2中有这样的结构体
struct sockbuf{

short sb_flags;
..........
}so_recv,so_snd;
其中flag 有这几种标志:
SB_LOCK;一个进程已经锁定了插口缓存
SB_WANT;一个进程正在等待给插口缓存加锁.

还有些宏和函数来管理插口的发送缓存和接收缓存
sblock,  sbunlock, sbwait(page 388,389)
也就是说感觉socket内部其实已经考虑到了这点,我们应用的时候是否只需要
一些操着比如设置一些标志位或者一些宏?

[ 本帖最后由 yuangong 于 2007-8-30 10:04 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2007-08-30 10:05 |只看该作者
原帖由 yuangong 于 2007-8-30 09:51 发表

每个socket都有自己的接收缓存,对socket加锁,也就是说每次write前对其加锁.
这样即使发生切换,缓存也只有一个线程能写.
所以不会发生A写了80字节后切换,B 写了30字节,A又写剩下的20字节.
也就是 说多线程对 ...

我觉得加不加锁是一样的,如果一个线程向一个socket写了80个字节,接着,另一个写20个字节,现在缓冲区中的东西就是两个线程共同写的内容了,因为内核清空缓冲和用户调用write是异步的。即使加锁,线程在写之前加了锁,调用完write后释放锁,此时不会再保护缓冲区,别的线程照样可以写进去的啊。

论坛徽章:
0
13 [报告]
发表于 2007-08-30 10:08 |只看该作者
原帖由 思一克 于 2007-8-30 10:01 发表
socket write应该是原子的。

查阅了下,write为原子操着,那么说不必要对socket进行加锁了.

论坛徽章:
0
14 [报告]
发表于 2007-08-30 10:11 |只看该作者
原帖由 cugb_cat 于 2007-8-30 10:05 发表

我觉得加不加锁是一样的,如果一个线程向一个socket写了80个字节,接着,另一个写20个字节,现在缓冲区中的东西就是两个线程共同写的内容了,因为内核清空缓冲和用户调用write是异步的。即使加锁,线程在写之 ...

不是.加锁就是保证一个线程写完所有的数据.不会产生一个线程还没有写完,另一个又开始往缓存中写.

论坛徽章:
0
15 [报告]
发表于 2007-08-30 10:11 |只看该作者
应该不用。
至于你各个THREAD数据交错问题那是应用层解决的。每个数据本身是原子的写。

原帖由 yuangong 于 2007-8-30 10:08 发表

查阅了下,write为原子操着,那么说不必要对socket进行加锁了.

论坛徽章:
0
16 [报告]
发表于 2007-08-30 10:16 |只看该作者
原帖由 yuangong 于 2007-8-30 10:11 发表

不是.加锁就是保证一个线程写完所有的数据.不会产生一个线程还没有写完,另一个又开始往缓存中写.

写完所有数据是不是就是把描述符缓冲区的内容清理掉?还是只调用了send或write?
中午拿标准输出试一下

论坛徽章:
0
17 [报告]
发表于 2007-08-30 10:17 |只看该作者
write是原子的,但是考虑
线程a写 1M字节的"aaa...
线程b写 1M字节的"bbbb...

论坛徽章:
0
18 [报告]
发表于 2007-08-30 10:23 |只看该作者
继续翻了下send 的实现,
发现了有如下代码:

  1. if(error = sblock(&so->so_snd, SBLOCKWAIT(flag)))   
  2.          goto  out;
  3. do{

  4. .......

  5. }
复制代码

函数在发送的时候,首先会对缓存加锁.通过加锁确保多个进程按序互斥访问插口缓存.(tcp/ip 卷2, page 394,395)
也就是说其实系统已经帮我们做好这些了.

论坛徽章:
0
19 [报告]
发表于 2007-08-30 10:26 |只看该作者
原帖由 flw2 于 2007-8-30 10:17 发表
write是原子的,但是考虑
线程a写 1M字节的"aaa...
线程b写 1M字节的"bbbb...

不是很明白你表达意思?难道说缓存满了收到的包是不完整的?

论坛徽章:
0
20 [报告]
发表于 2007-08-30 11:18 |只看该作者
写1M的aaa会只写了20K就写bbb吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP