免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4397 | 回复: 19
打印 上一主题 下一主题

跪求linux下多线程网络编程问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-02-23 09:44 |只看该作者 |倒序浏览
小弟想做一个客户端,同时向5个不同ip的服务器抓取数据(socket方式)
为了力求效率高,我才用了多线程的方式,由5个线程并发向5个服务器
抓取数据,
这时问题出现了,总有一定几率(10%左右)报connect错误或者读写错误
(改为串行抓取则没有问题),请教各位老大解答
ps:我给各个线程中的socket连接,读写加上互斥锁则没问题,但是这样
并发效率很低,跪求答案

论坛徽章:
0
2 [报告]
发表于 2005-02-23 09:48 |只看该作者

跪求linux下多线程网络编程问题

connect是主线程采用的,跟其他线程有什么关系?你不是5个线程相同样的描述符进行IO吧?

论坛徽章:
0
3 [报告]
发表于 2005-02-23 10:06 |只看该作者

跪求linux下多线程网络编程问题

回albcamus: 主线程没有connect,是5个子线程分别向5个服务器并发分别connect,也就是说每个子线程内分别connect的

论坛徽章:
0
4 [报告]
发表于 2005-02-23 10:15 |只看该作者

跪求linux下多线程网络编程问题

那一定是主线程用socket生成一个fd,
然后5个子线程都来向同一个fd connect了。

论坛徽章:
0
5 [报告]
发表于 2005-02-23 10:22 |只看该作者

跪求linux下多线程网络编程问题

谢谢各位解答,我的主线程没有connect链接,都是子线程在connect链接,每个子线程都有不同的描述字

论坛徽章:
0
6 [报告]
发表于 2005-02-23 10:25 |只看该作者

跪求linux下多线程网络编程问题

贴一下代码吧

论坛徽章:
0
7 [报告]
发表于 2005-02-23 10:51 |只看该作者

跪求linux下多线程网络编程问题

我也感觉是io冲突的问题,但是各个子线程肯定是使用了各自不同的描述字,不知道在多线程并发的时候,不同的描述字在几乎完全同时的情况下是否会有io冲突,代码简单如下:
string g_str[2];

void *threadt1(void *arg)
{
    int sock;
    pthread_detach(pthread_self());
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    ........
    if (connect(sock, (struct sockaddr*)&sin, sizeof(sin)) < 0)
    ........
    read....
    g_str[0] = "XXXX";
}
void *threadt2(void *arg)
{
    int sock;
    pthread_detach(pthread_self());
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    .......
    if (connect(sock, (struct sockaddr*)&sin, sizeof(sin)) < 0)
    ........
    read..
     g_str[1] = "XXXX";

}
main()
{
      num = 0;
      if(pthread_create(&id1,NULL,threadt1,(void *)num))  
      ........

      num = 1;
      if(pthread_create(&id2,NULL,threadt2,(void *)num))  
      ........

      if (!g_str[0].empty() && (!g_str[1].empty() )
      .......
}

因为我还有一些别的方面的考虑没用pthread_join来获取线程返回值,用了全局变量的方式,主要是请教高手关于并发出错的问题,谢谢了

论坛徽章:
0
8 [报告]
发表于 2005-02-23 11:04 |只看该作者

跪求linux下多线程网络编程问题

两个可能无关的问题
1. 不能保证 thread1在使用 num的时候,num的值仍旧是0,
即使在thread1一进去就是用num

2. g_str[0].empty()函数和 g_str[0] = "XXXX";
这个样子并非多线程安全的,empty()和"operator =()"里面其实还有好多代码哩.还不如直接用个int类型作为flag来的好.

论坛徽章:
0
9 [报告]
发表于 2005-02-23 11:12 |只看该作者

跪求linux下多线程网络编程问题

sock变量哪里来的?

论坛徽章:
0
10 [报告]
发表于 2005-02-23 11:15 |只看该作者

跪求linux下多线程网络编程问题

谢谢飞灰橙
这两点我都接受,不过第二点我在代码中也是用flag实现的,现在在这个简单示例里写成了判断string是否唯emtpy,呵呵,再次谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP