[打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]

yuangong

精灵


UID:453868
注册:2006-8-14
最后登录: 2008-01-14
帖子:164
精华:0

可用积分:258
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

1楼 发表于 2007-8-29 22:37 

今天和同事讨论一个问题,大家对这个问题有点分歧,在这里想听听大家的意见。
情景是假如有多个线程,对同一个socket(tcp)进行写操着,是否需要对这个socket进行加锁.
我的意见是不需要对socket进行加锁的,因为从来没见过这样的做法,而且感觉这些问题操作系统
或者说是tcp/ip协议应该都处理了,这仅仅是感觉.另一种意见说在写的过程中有可能写了一半的
数据到缓存中,发生了切换,另一个线程也可能写了些数据到缓存中,有可能导致接收方收到的不是
一个完整的包(混杂了2个线程写的包).我对这个说法感到怀疑,但是搜不到切实的理论依据,希望
在这方面有研究的高手们或者遇到过这个问题的同志们讲解或者能贴出解释这个问题的链接.
thanks.

[ 本帖最后由 yuangong 于 2007-8-29 22:39 编辑 ]

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
ehero   

圣骑士


UID:118769
注册:2003-12-11
最后登录: 2008-01-24
帖子:89
精华:0

可用积分:200
信誉积分:100
专家积分:0 (本版)

状态:...保密...

[资料] [站内短信] [Blog]

2楼 发表于 2007-8-29 23:01 

对socket不用加锁,但对你要用到写缓冲区需要锁定,因为那个是共享资源。
您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

~~~~~~~~~~~~~~~~~~~~~~
~Make EAServer/ASE/ASA better.~
~~~~~~~~~~~~~~~~~~~~~~
welcome to iihero lab
http://iihero.8800.org
http://www.iihero.cn
~~~~~~~~~~~~~~~~~~~~~~

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
cugb_cat   

法师


UID:342049
注册:2005-11-27
最后登录: 2008-01-24
帖子:5508
精华:3

可用积分:3225
信誉积分:105
专家积分:55 (本版)

来自:北京海淀中关村
状态:...在线...

[资料] [站内短信] [Blog]

3楼 发表于 2007-8-29 23:19 

socket描述符就是一个普通的文件描述符吧,和标准输出的情况应该一样的
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
diker007

圣骑士


UID:341300
注册:2005-11-25
最后登录: 2008-01-17
帖子:82
精华:0

可用积分:82
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

4楼 发表于 2007-8-30 00:23 

多个线程操作一个socket,就算加了锁,数据在内核缓冲区也可能会出现交替。
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
cugb_cat   

法师


UID:342049
注册:2005-11-27
最后登录: 2008-01-24
帖子:5508
精华:3

可用积分:3225
信誉积分:105
专家积分:55 (本版)

来自:北京海淀中关村
状态:...在线...

[资料] [站内短信] [Blog]

5楼 发表于 2007-8-30 09:19 

QUOTE:
原帖由 diker007 于 2007-8-30 00:23 发表
多个线程操作一个socket,就算加了锁,数据在内核缓冲区也可能会出现交替。

恩,向描述符输出了就是写到缓冲区,至于何时将缓冲区内容写出,由内核决定,例如,标准输出,采用行缓冲的话,直到遇到/n或缓冲区满或fflush,才会将缓冲区内容写出,

[ 本帖最后由 cugb_cat 于 2007-8-30 09:59 编辑 ]

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
yuangong

精灵


UID:453868
注册:2006-8-14
最后登录: 2008-01-14
帖子:164
精华:0

可用积分:258
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

6楼 发表于 2007-8-30 09:23 

那个写缓存为系统资源,如何能对其加锁?
加锁socket是保证每次只有一个线程对其操着,数据在内核缓冲区应该是不会出现交替
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
flw2   

精灵使


UID:338767
注册:2005-11-19
最后登录: 2008-01-24
帖子:4296
精华:1

可用积分:3538
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

7楼 发表于 2007-8-30 09:31 

和socket还是普通文件没有关系,因为write的参数是fd,而不是socket特定的
多个线程都要写的有几个特点
1.哪个线程先写是不一定的
2.写可能少于要写的字节

很显然,内核不负责,可能出现这种情况
a线程写100个字节,结果返回80,然后到用户态了,最后b线程又写,写成功了若干字节。

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
mtx99   

精灵王


UID:328601
注册:2005-10-27
最后登录: 2008-01-24
帖子:273
精华:0

可用积分:267
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

8楼 发表于 2007-8-30 09:42 

我一般为了保险起见,加上锁的。

我一般为了保险起见,加上锁的。
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
yuangong

精灵


UID:453868
注册:2006-8-14
最后登录: 2008-01-14
帖子:164
精华:0

可用积分:258
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

9楼 发表于 2007-8-30 09:51 

QUOTE:
原帖由 flw2 于 2007-8-30 09:31 发表
和socket还是普通文件没有关系,因为write的参数是fd,而不是socket特定的
多个线程都要写的有几个特点
1.哪个线程先写是不一定的
2.写可能少于要写的字节

很显然,内核不负责,可能出现这种情况
a线程写 ...

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

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
思一克   

版主-法师


UID:88701
注册:2003-8-25
最后登录: 2008-01-24
帖子:5334
精华:12

可用积分:3297
信誉积分:100
专家积分:20 (本版)

来自:东城
状态:...保密...

[资料] [站内短信] [Blog]

10楼 发表于 2007-8-30 10:01 

socket write应该是原子的。
您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

Email: johnye@webizmail.com

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖

[打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]

yuangong

精灵


UID:453868
注册:2006-8-14
最后登录: 2008-01-14
帖子:164
精华:0

可用积分:258
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

11楼 发表于 2007-8-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] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
cugb_cat   

法师


UID:342049
注册:2005-11-27
最后登录: 2008-01-24
帖子:5508
精华:3

可用积分:3225
信誉积分:105
专家积分:55 (本版)

来自:北京海淀中关村
状态:...在线...

[资料] [站内短信] [Blog]

12楼 发表于 2007-8-30 10:05 

QUOTE:
原帖由 yuangong 于 2007-8-30 09:51 发表

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

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

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
yuangong

精灵


UID:453868
注册:2006-8-14
最后登录: 2008-01-14
帖子:164
精华:0

可用积分:258
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

13楼 发表于 2007-8-30 10:08 

QUOTE:
原帖由 思一克 于 2007-8-30 10:01 发表
socket write应该是原子的。

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

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
yuangong

精灵


UID:453868
注册:2006-8-14
最后登录: 2008-01-14
帖子:164
精华:0

可用积分:258
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

14楼 发表于 2007-8-30 10:11 

QUOTE:
原帖由 cugb_cat 于 2007-8-30 10:05 发表

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

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

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
思一克   

版主-法师


UID:88701
注册:2003-8-25
最后登录: 2008-01-24
帖子:5335
精华:12

可用积分:3298
信誉积分:100
专家积分:20 (本版)

来自:东城
状态:...保密...

[资料] [站内短信] [Blog]

15楼 发表于 2007-8-30 10:11 

应该不用。
至于你各个THREAD数据交错问题那是应用层解决的。每个数据本身是原子的写。

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

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

您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

Email: johnye@webizmail.com

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
cugb_cat   

法师


UID:342049
注册:2005-11-27
最后登录: 2008-01-24
帖子:5508
精华:3

可用积分:3225
信誉积分:105
专家积分:55 (本版)

来自:北京海淀中关村
状态:...在线...

[资料] [站内短信] [Blog]

16楼 发表于 2007-8-30 10:16 

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

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

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

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
flw2   

精灵使


UID:338767
注册:2005-11-19
最后登录: 2008-01-24
帖子:4296
精华:1

可用积分:3538
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

17楼 发表于 2007-8-30 10:17 

write是原子的,但是考虑
线程a写 1M字节的"aaa...
线程b写 1M字节的"bbbb...
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
yuangong

精灵


UID:453868
注册:2006-8-14
最后登录: 2008-01-14
帖子:164
精华:0

可用积分:258
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

18楼 发表于 2007-8-30 10:23 

继续翻了下send 的实现,
发现了有如下代码:

[Copy to clipboard] [ - ]

CODE:

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

.......

}

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

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
yuangong

精灵


UID:453868
注册:2006-8-14
最后登录: 2008-01-14
帖子:164
精华:0

可用积分:258
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

19楼 发表于 2007-8-30 10:26 

QUOTE:
原帖由 flw2 于 2007-8-30 10:17 发表
write是原子的,但是考虑
线程a写 1M字节的"aaa...
线程b写 1M字节的"bbbb...

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

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
flw2   

精灵使


UID:338767
注册:2005-11-19
最后登录: 2008-01-24
帖子:4296
精华:1

可用积分:3538
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

20楼 发表于 2007-8-30 11:18 

写1M的aaa会只写了20K就写bbb吗?
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖

[打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]

flw2   

精灵使


UID:338767
注册:2005-11-19
最后登录: 2008-01-24
帖子:4296
精华:1

可用积分:3538
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

21楼 发表于 2007-8-30 11:19 

QUOTE:
原帖由 yuangong 于 2007-8-30 10:23 发表
继续翻了下send 的实现,
发现了有如下代码:

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

.......

}

函数在发送的时候,首先会对缓存加锁.通过加锁确保多个进 ...

都到这来了,这个锁是内核维护一致性的锁,而不是保证写10M的内容会一直等待直到成功。

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
空灵静世   

精灵


UID:247870
注册:2005-3-31
最后登录: 2007-12-20
帖子:178
精华:0

可用积分:284
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

22楼 发表于 2007-8-30 11:30 

发送数据的时候,操作系统会自己加锁,sys_send 函数会调用get_futex_key
在内核堆栈中看到的
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
空灵静世   

精灵


UID:247870
注册:2005-3-31
最后登录: 2007-12-20
帖子:178
精华:0

可用积分:284
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

23楼 发表于 2007-8-30 11:35 

楼主的意思应该是当一个线程在一次性调用send,还没退出的时候,会不会有另外的线程调用send把信息插进来
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
yuangong

精灵


UID:453868
注册:2006-8-14
最后登录: 2008-01-14
帖子:164
精华:0

可用积分:258
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

24楼 发表于 2007-8-30 11:43 

QUOTE:
原帖由 空灵静世 于 2007-8-30 11:35 发表
楼主的意思应该是当一个线程在一次性调用send,还没退出的时候,会不会有另外的线程调用send把信息插进来

对,就是这个意思.

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
yuangong

精灵


UID:453868
注册:2006-8-14
最后登录: 2008-01-14
帖子:164
精华:0

可用积分:258
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

25楼 发表于 2007-8-30 12:04 

QUOTE:
原帖由 flw2 于 2007-8-30 11:19 发表

都到这来了,这个锁是内核维护一致性的锁,而不是保证写10M的内容会一直等待直到成功。

当然不会一直写10M直到写完,一般来说是写一个包(大概4K)然后返回.

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
flw2   

精灵使


UID:338767
注册:2005-11-19
最后登录: 2008-01-24
帖子:4296
精华:1

可用积分:3538
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

26楼 发表于 2007-8-30 12:16 

QUOTE:
原帖由 空灵静世 于 2007-8-30 11:35 发表
楼主的意思应该是当一个线程在一次性调用send,还没退出的时候,会不会有另外的线程调用send把信息插进来

恩,那么答案是会。(还没有退出怎么理解,我先把它理解为系统调用还未结束)
write只是保证所写成功字节是原子的
只有在得到锁之后的操作是原子的

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
flw2   

精灵使


UID:338767
注册:2005-11-19
最后登录: 2008-01-24
帖子:4296
精华:1

可用积分:3538
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

27楼 发表于 2007-8-30 12:17 

QUOTE:
原帖由 yuangong 于 2007-8-30 12:04 发表

当然不会一直写10M直到写完,一般来说是写一个包(大概4K)然后返回.

跟包有什么关系?跟协议层的缓存相关的。再者。包的大小4K是什么包?

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
bobozhang

圣骑士


UID:202804
注册:2004-11-26
最后登录: 2008-01-22
帖子:115
精华:0

可用积分:177
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

28楼 发表于 2007-8-30 12:28 

多线程写socket应该要加锁,而且要保证返回值等于要发送的数据长度或出错后才能解锁。虽然内核在写一个文件时可能会自动加锁,但是如果socket缓冲区不足以容纳下用户的所有数据的话,线程要进入睡眠状态,这时系统是否会解锁跟实现有关吧
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
思一克   

版主-法师


UID:88701
注册:2003-8-25
最后登录: 2008-01-24
帖子:5335
精华:12

可用积分:3298
信誉积分:100
专家积分:20 (本版)

来自:东城
状态:...保密...

[资料] [站内短信] [Blog]

29楼 发表于 2007-8-30 12:35 

我更正前面2个回答。

应该是当需要写的数据小于某一个数字(比如一页(?))时候才是原子的。数据大了不是。

QUOTE:
原帖由 思一克 于 2007-8-30 10:11 发表
应该不用。
至于你各个THREAD数据交错问题那是应用层解决的。每个数据本身是原子的写。

您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

Email: johnye@webizmail.com

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
codekiller    (Eric)

精灵


UID:533128
注册:2007-3-5
最后登录: 2008-01-21
帖子:170
精华:0

可用积分:165
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

30楼 发表于 2007-8-30 13:08 

应该对socket加锁。 尤其是对非阻塞的socket,底层对缓冲区加锁并不能解决数据交错的问题。
您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

If linux does not give you a solution, you have a wrong problem.

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖

[打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]

cookis

风云使者


UID:389167
注册:2006-3-20
最后登录: 2008-01-24
帖子:584
精华:0

可用积分:640
信誉积分:100
专家积分:0 (本版)

来自:BeiJing
状态:...离线...

[资料] [站内短信] [Blog]

31楼 发表于 2007-8-30 13:30 

EN 同意 FLW2 的意见.

我想flw2 是想让你在 send_n 的时候加锁
虽然系统send 是原子的..但不保证 send_n是原子的..所以要加锁以保证 线程A send_n完后.
线程B再send_n .

您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

|  (/_/)  This is Bunny. Copy and paste Bunny
| (='.'=) into your signature to help him gain
| (")_(") world domination.

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
空灵静世   

精灵


UID:247870
注册:2005-3-31
最后登录: 2007-12-20
帖子:178
精华:0

可用积分:284
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

32楼 发表于 2007-8-30 14:31 

思一克在另外一个贴子里说write < 4096 个字节的数据是原子的,那send呢?也这样吗?
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
思一克   

版主-法师


UID:88701
注册:2003-8-25
最后登录: 2008-01-24
帖子:5335
精华:12

可用积分:3298
信誉积分:100
专家积分:20 (本版)

来自:东城
状态:...保密...

[资料] [站内短信] [Blog]

33楼 发表于 2007-8-30 14:47 

我那个帖子是说写PIPE4096以下肯定是原子的。(pipe_buf大小)
写文件不是。
写socket, 好象MTU--头大小(约等于1400)以下是原子的。但不是非常肯定。

QUOTE:
原帖由 空灵静世 于 2007-8-30 14:31 发表
思一克在另外一个贴子里说write < 4096 个字节的数据是原子的,那send呢?也这样吗?

您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

Email: johnye@webizmail.com

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
空灵静世   

精灵


UID:247870
注册:2005-3-31
最后登录: 2007-12-20
帖子:178
精华:0

可用积分:284
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

34楼 发表于 2007-8-30 14:56 

QUOTE:
原帖由 思一克 于 2006-9-17 23:48 发表

2) 如果写文件, 每次写小于4096, 也是原子的, 数据不交叉, 也不需要LOCK. 结论用程序测试是对的,但没有得到可靠的理论根据. 数据大于4096, 不是原子的. 对于写LOG file, 一行一行的写, 因为每行<<4096,所以程序的结果是原子的.

这里不是说写文件<4096也是原子的吗?

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
思一克   

版主-法师


UID:88701
注册:2003-8-25
最后登录: 2008-01-24
帖子:5335
精华:12

可用积分:3298
信誉积分:100
专家积分:20 (本版)

来自:东城
状态:...保密...

[资料] [站内短信] [Blog]

35楼 发表于 2007-8-30 15:03 

不是。我说了没有得到可靠的论据支持。

QUOTE:
原帖由 空灵静世 于 2007-8-30 14:56 发表

这里不是说写文件

您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

Email: johnye@webizmail.com

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
lanneret_sky

风云使者


UID:582245
注册:2007-7-2
最后登录: 2007-12-21
帖子:523
精华:0

可用积分:275
信誉积分:100
专家积分:5 (本版)

状态:...保密...

[资料] [站内短信] [Blog]

36楼 发表于 2007-8-30 15:09 

我刚学网络编程的时候也傻到给socket加锁,后来用代码验证是不需要加锁的
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
flw2   

精灵使


UID:338767
注册:2005-11-19
最后登录: 2008-01-24
帖子:4296
精华:1

可用积分:3538
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

37楼 发表于 2007-8-30 15:32 

QUOTE:
原帖由 lanneret_sky 于 2007-8-30 15:09 发表
我刚学网络编程的时候也傻到给socket加锁,后来用代码验证是不需要加锁的

呵呵,我觉得代码可以证明需要做什么。而不能证明不需要做什么。

就好比一个bug 100万年才可能发生一次,我们不能跑1年甚至1万年就说程序没有bug

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
思一克   

版主-法师


UID:88701
注册:2003-8-25
最后登录: 2008-01-24
帖子:5335
精华:12

可用积分:3298
信誉积分:100
专家积分:20 (本版)

来自:东城
状态:...保密...

[资料] [站内短信] [Blog]

38楼 发表于 2007-8-30 15:55 

socket写时基本上没有加锁的需求。多个不同的程序同时写一个socket,一般没有这样做的
您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

Email: johnye@webizmail.com

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
kuaizaifeng   

天使
手稳如铁,头锐如刀


UID:430246
注册:2006-6-13
最后登录: 2008-01-21
帖子:1236
精华:2

可用积分:1008
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

39楼 发表于 2007-8-30 17:11 

要加锁
您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

“阿,去死罢,你们这些不得不死的人!去受苦罢,你们这些非受苦不可的人!人不是为了快乐而生的,是为了服从我的意志的。痛苦罢!死罢!可是别忘了你的使命是做个人。——你就得做个人。”

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
redearth1861   

新手

UID:461124
注册:2006-9-2
最后登录: 2007-11-06
帖子:2
精华:0

可用积分:2
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

40楼 发表于 2007-8-30 19:09 

回复 #37 flw2 的帖子

归纳法只能证伪,不能证实
呵呵
您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

open mind

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖

[打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]

ypxing   

天使
老A


UID:200790
注册:2004-11-19
最后登录: 2008-01-24
帖子:1192
精华:4

可用积分:1397
信誉积分:100
专家积分:130 (本版)

状态:...保密...

[资料] [站内短信] [Blog]

41楼 发表于 2007-8-30 19:14 

支持

QUOTE:
原帖由 思一克 于 2007-8-30 15:55 发表
socket写时基本上没有加锁的需求。多个不同的程序同时写一个socket,一般没有这样做的

您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

钢七连
不抛弃,不放弃
http://ypxing.cublog.cn/

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
liguangyi

新手

UID:591268
注册:2007-7-24
最后登录: 2007-12-17
帖子:4
精华:0

可用积分:3
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

42楼 发表于 2007-8-31 09:31 

一般都是多个工作线程把需要发送的数据写到一个加锁的缓冲区中,然后另外一个线程单独进行收发。多个线程直接写socket还真没这么做过。我觉得应该是加锁处理,并且需要判断已发送字节数等于发送字节数才成。
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
lanneret_sky

风云使者


UID:582245
注册:2007-7-2
最后登录: 2007-12-21
帖子:523
精华:0

可用积分:275
信誉积分:100
专家积分:5 (本版)

状态:...保密...

[资料] [站内短信] [Blog]

43楼 发表于 2007-8-31 15:27 

QUOTE:
原帖由 flw2 于 2007-8-30 15:32 发表

呵呵,我觉得代码可以证明需要做什么。而不能证明不需要做什么。

就好比一个bug 100万年才可能发生一次,我们不能跑1年甚至1万年就说程序没有bug

一个字回答大侠,牛

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
benjiam (xxxx)

天使


UID:59508
注册:2003-5-27
最后登录: 2008-01-21
帖子:1081
精华:0

可用积分:649
信誉积分:105
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

44楼 发表于 2007-9-1 19:52 

需要加锁。 除非单一线程发送
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
Jass (打破砂锅问到底)

精灵王


UID:571131
注册:2007-6-2
最后登录: 2008-01-05
帖子:294
精华:0

可用积分:251
信誉积分:105
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

45楼 发表于 2007-9-11 20:46 

把这个贴子再顶起来,因为我今天刚好碰到了这个问题。用多个线 程写一个套接口,读据在应用层肯定是混在一起的,比如线程t1要写100个'a',线程t2要写100个'b',那么实际上对方接收到的数据是a、b混杂 的,这就一点意义也没有了。有人说write是原子的,但是我们一般用的都是writen吧,很少调用一次write不管结果如何都返回的。可以结贴了 吧,呵呵

[ 本帖最后由 Jass 于 2007-9-11 21:16 编辑 ]

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
MingLin1231   

精灵王


UID:512965
注册:2006-12-31
最后登录: 2008-01-23
帖子:277
精华:0

可用积分:275
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

46楼 发表于 2007-9-12 10:15 

对SOCKET的写操作从用户的角度并不是原子的,因为如果一次发送1M数据,肯定不是原子的.至于一次发送多少会是原子的,好像没有明确的说法 (最好不要去做原子性的假设) (和MTU是没有关系的,那是底层的分包)
您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

不经历风雨,怎能见彩虹

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
yourantianya   

风云使者


UID:468895
注册:2006-9-23
最后登录: 2008-01-23
帖子:667
精华:0

可用积分:503
信誉积分:100
专家积分:0 (本版)

来自:豫S
状态:...离线...

[资料] [站内短信] [Blog]

47楼 发表于 2007-9-21 11:00 

归根结底好像有两个结论:

1.避免多个线程同时对一个socket进行操作。

2.如果是在无法避免上述情况,则应该加锁。

是否正确?

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
googhu

侠客


UID:590909
注册:2007-7-23
最后登录: 2008-01-23
帖子:13
精华:0

可用积分:13
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

48楼 发表于 2007-10-8 17:05 

其实多个线程同时对一个socket进行写操作没有什么意义,因为接收方收到的数据是混杂的,无意义的,如果确实要这样做,那么想办法想出另一个机制会更好点!这个机制是怎样确保接收方收到的数据是有意义的!
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
flw   

版主-法王
侠客


UID:14893
注册:2002-8-12
最后登录: 2008-01-24
帖子:16903
精华:10

可用积分:5840
信誉积分:285
专家积分:0 (本版)

状态:...在线...

[资料] [站内短信] [Blog]

49楼 发表于 2007-10-8 17:11 

要加锁。
您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
JohnBull   

版主-法师


UID:17373
注册:2002-8-27
最后登录: 2008-01-22
帖子:5525
精华:2

可用积分:2272
信誉积分:100
专家积分:10 (本版)

来自:北京朝阳
状态:...离线...

[资料] [站内短信] [Blog]

50楼 发表于 2007-10-8 23:27 

你为什么要让多个线程并发写同一个流式socket???
您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

本人的 Wii code 是 1534 3997 2932 3914

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖

[打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]

cjaizss   

版主-精灵使


UID:272747
注册:2005-5-26
最后登录: 2008-01-24
帖子:3099
精华:0

可用积分:2580
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

51楼 发表于 2007-10-9 00:05 

TCP难说哦,TCP的发送,比方用write,可是每一次不 一定会write出你需要的字节数,那么就需要对write做一个封装,我一般取名writen。也就是TCP发一个“包”出去,可能要write好几次 的,好几次陷入system call,于是恶性竞争就来了
您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

其实,我也就是一菜鸟。也只是入门,大哥他都说自己是入门,或许我连门都没入...
做个合格的电子工程师,其实很难
流自己的汗,吃自己的饭,自己的事自己干,靠人靠天靠祖上,不算是好汉。

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
xhl   

光明使者


UID:53252
注册:2003-4-22
最后登录: 2008-01-15
帖子:988
精华:0

可用积分:290
信誉积分:100
专家积分:0 (本版)

状态:...保密...

[资料] [站内短信] [Blog]

52楼 发表于 2007-10-9 00:34 

多个thead写这种事情, 几乎想不到什么地方的应用能用的到。

即使真的有这样的需求, 自己实现个简单的小FIFO, 把LOCK部分作在应用层, 用一个socket thread来write 不就可以了吗。

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
wuxiangzhi

精灵
老黄牛


UID:537263
注册:2007-3-15
最后登录: 2008-01-20
帖子:223
精华:0

可用积分:208
信誉积分:100
专家积分:0 (本版)

来自:未知
状态:...离线...

[资料] [站内短信] [Blog]

53楼 发表于 2007-10-9 09:10 

加锁吧
但是,我想问的是,多个线程往一个socket里写的,也就意味着写无序,那么另外一端的读操作岂不是很郁闷
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
wuxiangzhi

精灵
老黄牛


UID:537263
注册:2007-3-15
最后登录: 2008-01-20
帖子:223
精华:0

可用积分:208
信誉积分:100
专家积分:0 (本版)

来自:未知
状态:...离线...

[资料] [站内短信] [Blog]

54楼 发表于 2007-10-9 09:11 

做过一个项目,需要多个线程用同一个SOCKET,记得当时是加锁了的,因为通信是同步的,不加锁的话,没办法做同步。
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
selfrun

侠客


UID:550233
注册:2007-4-11
最后登录: 2008-01-24
帖子:19
精华:0

可用积分:22
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

55楼 发表于 2007-10-9 10:20 

如果需要多个线程同时读访问或写访问同一个tcp socket, 那多半是程序设计上出了问题。

对于tcp的传输,都是要用应用层的协议保证接收方能解释对方发送过来的数据,这样,至少要保证一块数据是一个完整的协议包。

如果是多个线程同时写socket,那么在临界区里工作的线程为了保证数据包的完整发送,必须循环发送等待,直到数据都发送到系统缓冲区才能离开临界区。
而这样就导致socket的行为与阻塞方式发送无异,发送效率因此而被限制。

我觉得一个好的tcp socket处理框架,应该是只有一个线程来负责数据的收发,从而避免那些无穷无尽的同步问题。

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
shixiaobo925

天使
年轻人应该有辆车滴


UID:601192
注册:2007-8-10
最后登录: 2008-01-18
帖子:1397
精华:0

可用积分:1
信誉积分:85
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

56楼 发表于 2007-10-9 11:50 

MARK,谢谢到了,谢谢各位大虾
您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
DaYuTou

骑士


UID:341195
注册:2005-11-25
最后登录: 2007-10-27
帖子:66
精华:0

可用积分:56
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

57楼 发表于 2007-10-9 18:12 

是否要加锁,关键要看你的每个线程是否都有自己独立的发送缓冲区,如果有的话就不用加锁了,当然这样一来接受方就痛苦了哦,因为不能保证每次都能把数据完整发送出去,接受方的可能收到的其实是两个包的各一部分,俗称“粘包”。
如果多个线程共用一个缓冲区,则肯定要加锁了,一个发送完,另一个才能使用
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
mantiser (Samuel.C.H)

骑士


UID:601333
注册:2007-8-11
最后登录: 2007-12-23
帖子:53
精华:0

可用积分:53
信誉积分:0
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

58楼 发表于 2007-10-15 23:45 

一般都是加锁的,因为会话层状态需要和socket层状态同步
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
JohnBull   

版主-法师


UID:17373
注册:2002-8-27
最后登录: 2008-01-22
帖子:5525
精华:2

可用积分:2272
信誉积分:100
专家积分:10 (本版)

来自:北京朝阳
状态:...离线...

[资料] [站内短信] [Blog]

59楼 发表于 2007-10-17 10:23 

QUOTE:
原帖由 selfrun 于 2007-10-9 10:20 发表
如果需要多个线程同时读访问或写访问同一个tcp socket, 那多半是程序设计上出了问题。

对于tcp的传输,都是要用应用层的协议保证接收方能解释对方发送过来的数据,这样,至少要保证一块数据是一个完整的协议 ...

正解!

您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

本人的 Wii code 是 1534 3997 2932 3914

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
yuangong

精灵


UID:453868
注册:2006-8-14
最后登录: 2008-01-14
帖子:164
精华:0

可用积分:258
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

60楼 发表于 2007-10-17 13:41 

其实这种情况很常见,为什么说是设计的问题?
举个例子:
一个porxy服务器,一边连接客户端,一边连接服务端的80端口.对于每个客户的连接处理为一个线程,收到客户消息转发到服务器.
您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖

[打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]

snow888

大天使


UID:208930
注册:2004-12-18
最后登录: 2008-01-24
帖子:2120
精华:3

可用积分:1984
信誉积分:100
专家积分:0 (本版)

状态:...保密...

[资料] [站内短信] [Blog]

61楼 发表于 2007-10-17 17:02 

QUOTE:
原帖由 yuangong 于 2007-10-17 13:41 发表
其实这种情况很常见,为什么说是设计的问题?
举个例子:
一个porxy服务器,一边连接客户端,一边连接服务端的80端口.对于每个客户的连接处理为一个线程,收到客户消息转发到服务器.

httpd - 2.2 里面是如何做的???

(PS:一直以来只编译,没具体看过程序代码)

您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

甲午耻,犹未雪。国人恨,何时灭。驾长车,踏破富士山缺。壮志饥餐日虏肉,
笑谈渴饮倭奴血。待从头,收拾旧山河,朝天阙。

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
思一克   

版主-法师


UID:88701
注册:2003-8-25
最后登录: 2008-01-24
帖子:5335
精华:12

可用积分:3298
信誉积分:100
专家积分:20 (本版)

来自:东城
状态:...保密...

[资料] [站内短信] [Blog]

62楼 发表于 2007-10-17 17:23 

PROXY, 对于CLIENT的一个连接,就建立一个到SERVER的连接.
所以,混杂的情况是没有的.

不同的FLOW的包混在一个LINK中是设计出问题了.

QUOTE:
原帖由 snow888 于 2007-10-17 17:02 发表

httpd - 2.2 里面是如何做的???

(PS:一直以来只编译,没具体看过程序代码)

您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

Email: johnye@webizmail.com

做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖
safedead

精灵王


UID:407631
注册:2006-4-23
最后登录: 2008-01-23
帖子:333
精华:0

可用积分:347
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]

63楼 发表于 2007-10-18 09:42 

TCP的话,这种设计是有问题的,标准代理服务器没有这么搞的
UDP的话,这种设计也不多见

我倒是干过这么一件事情
1个程序2000个线程,共享一个UDP套接字,不加锁
所有线程都通过这个fd发送日志
所有日志信息都是固定的1024字节,发送都是调用一次send()完成
在消息长度恒定并且只发送不接收这个特定条件下
工作效果还行
不会出现某个线程的日志和另外一个交错的情况
但是会丢失很少量日志,原因是UDP导致的

您对本贴的看法:鲜花[0] 臭蛋[0]
做DBA,拿高薪,从CUUG开始 | 尚观最新ULP学员薪资统计报告! | 学Solaris 10 红宝书教程 得iPod大奖

多线程同时写socket是否需要加锁(转)相关推荐

  1. Java多线程中使用ReentrantLock、synchronized加锁 简单举例

    Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...

  2. socket 长链接linux,手把手教你写 Socket 长连接

    原标题:手把手教你写 Socket 长连接 8点43分打卡 就是真爱 本文转载自公众号 玉刚说,由玉刚说写作平台[1]提供写作赞助 原作者:水晶虾饺[2] 版权声明:本文版权归微信公众号玉刚说所有,未 ...

  3. 手把手教你写 Socket 长连接

    本文由玉刚说写作平台[1]提供写作赞助 原作者:水晶虾饺[2] 版权声明:本文版权归微信公众号 玉刚说 所有,未经许可,不得以任何形式转载 本篇我们先简单了解一下 TCP/IP,然后通过实现一个 ec ...

  4. Linux 多线程 ”一写多读” 模式下的无锁设计

    缘起 双buffer "无锁" 设计 指针的切换 ptr 竞争条件的解决 指针访问丢失 延伸 结语 缘起 在linux多线程环境下对同一变量进行读写时,经常会遇到读写的原子性问题, ...

  5. 多线程读一个全局变量要不要加锁?还是说只是当修改全局变量的时候才要加锁?...

    如果所有线程都只读取该变量的话不必加锁,因为仅读取不存在破坏数据的风险,如果有线程写该变量的话不管读取还是写入都要加锁的.

  6. linux 多线程聚集写程序,Linux篇二:Makefile写多线程多文件程序-Go语言中文社区...

    距离上次布置任务已经两个周了,虽然这是自己的业余学习,还是为自己的工作时间安排表示有待提高.. 废话不多说,直接上干货. 这次老师布置的任务要求是,Makefile写多线程.多文件调用.用上数学函数. ...

  7. 多线程方式实现Socket通信

    一.首先,介绍下两类传输协议:TCP:UDP TCP是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输,得到的是一个顺序的无差错的数据流 ...

  8. [Golang] 从零開始写Socket Server(3): 对长、短连接的处理策略(模拟心跳)

    通过前两章,我们成功是写出了一套凑合能用的Server和Client,并在二者之间实现了通过协议交流.这么一来,一个简易的socket通讯框架已经初具雏形了,那么我们接下来做的.就是想办法让这个框架更 ...

  9. python多线程怎么写日志_Python日志记录在多进程下的使用

    1. 问题描述 项目中,使用RotatingFileHandler根据日志文件大小来切分日志.设置文件的MaxBytes为1GB, backupCount大小为5. 经查看,发现日志文件的大小均小于1 ...

最新文章

  1. ECLIPSE启动不了,报错org.eclipse.swt.SWTException: Invalid thread access
  2. 认认真真推荐9个值得关注的公众号
  3. 【Python】牛客的输入输出到底怎么整??
  4. android6.0源码分析之Runtime的初始化
  5. MySQL索引的坑,谁踩谁知道……
  6. 不在JPA 的 persistence.xml 文件里配置Entity class的解决的方法
  7. 深度学习(十二)——Winograd(2)
  8. C# Winform 出现异常:无法将顶级控件添加到控件,解决方案如下:
  9. 不要把异常当做业务逻辑,这性能可能你无法承受
  10. Spring Bootstrap中带有配置元数据的高级配置
  11. 【VS C++ 2010】查看内存的方法详解
  12. 英语四级真题作文 计算机,2019年6月大学英语四级作文范文50例:电脑
  13. 8 SystemVerilog语言编写UART发送
  14. Ubuntu安装teamviewer
  15. LSTM神经网络图解
  16. Latex系列[2]--公式中的字体
  17. Mac 蓝牙鼠标卡顿的解决方法
  18. 不看好叮咚买菜的N个理
  19. 交流群和一些工具分享
  20. 微波射频学习笔记10-------T型结功率分配器

热门文章

  1. mac下载maven详细步骤
  2. html中文字处理美化的效果,css字体相关样式的处理
  3. i511260h和i511400h区别
  4. Unity动画☀️七、Humanoid—loop match、Bake Into Pose、Based Upon、offset、Mirror
  5. 长安UNIT鸿蒙系统,花13万提辆长安UNIT值吗?行驶1600公里后,车主终于说了句大实话...
  6. 赞爆!全国计算机专业数据库系统工程师考试指定教程(第三版)
  7. 【见闻录系列】我所理解的“业务”
  8. 计算机音乐谱红昭愿,天谕手游红昭愿乐谱代码是什么-天谕手游红昭愿乐谱代码分享_快吧手游...
  9. 阿里云发布三大人工智能产品,构建最全AI平台
  10. 批量将文件中汉字数字替换为阿拉伯数字