免费注册 查看新帖 |

Chinaunix

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

用小小的锁,解决了流量控制问题,爽!!! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-06-19 22:52 |只看该作者
原帖由 bobozhang 于 2009-6-19 17:46 发表
呵呵,楼主不是在多个线程里面write()一个socket吧!

有可能

论坛徽章:
0
12 [报告]
发表于 2009-06-20 10:58 |只看该作者

回复 #10 bobozhang 的帖子

我们这个系统确实是存在多个线程send一个socket。
而且是非阻塞send,实际是一个send循环。
这种情况依然没有锁,以前不出错,还真是运气了。
好大的bug。

论坛徽章:
0
13 [报告]
发表于 2009-06-20 15:54 |只看该作者
无敌了! 楼主强!

论坛徽章:
0
14 [报告]
发表于 2009-06-20 17:48 |只看该作者
原帖由 urapple 于 2009-6-20 10:58 发表
我们这个系统确实是存在多个线程send一个socket。
而且是非阻塞send,实际是一个send循环。
这种情况依然没有锁,以前不出错,还真是运气了。
好大的bug。


说明楼主你人品不错赛

论坛徽章:
3
巳蛇
日期:2014-04-24 17:25:352015年辞旧岁徽章
日期:2015-03-03 16:54:15NBA常规赛纪念章
日期:2015-05-04 22:32:03
15 [报告]
发表于 2009-06-20 22:12 |只看该作者
这种问题除了用锁还有没有别的解决途径?
信号量?消息队列?select()? epoll? 我是新手,不懂乱说的 。。。别介意:wink:

论坛徽章:
0
16 [报告]
发表于 2009-06-21 09:27 |只看该作者
多个线程同时调用write会出问题吗 ---转自网络

多进程用 write 往同一个文件添加日志是否要加锁的问题
根据 antijp@newsmth 的解释,有如下结论:

根据 SUSv3 的规定,write() 的调用是原子的,两个进程间的 write(fd, buf, len)不会
导致两个 buf 的内容在文件中交错,因此只要两个进程在写每一条 log 时保证只用一次
write,那么 log 就不会交错。但注意要加 O_APPEND,以保证两个进程不会覆盖
彼此的数据。

对于普通文件,write() 不算低速系统调用,不会被信号中断,write() 只有在磁盘满、限额满
时才返回小于 count 的数。

由于这种特性,在往记录文件添加记录时,只要保证一条记录只用一次 write() ,并且文件用
O_APPEND() 方式打开,就能保证多个进程正确的添加记录,无需加锁。

论坛徽章:
0
17 [报告]
发表于 2009-06-21 11:59 |只看该作者

回复 #16 皇家救星 的帖子

兄台没有看太清楚我说的是非阻塞发送赛!
非阻塞send肯定是一个循环发送的过程。一次发的经常只是整个数据的一小部分,需要循环发送才能发完。O(∩_∩)O~

[ 本帖最后由 urapple 于 2009-6-22 18:10 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP