免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1909 | 回复: 5
打印 上一主题 下一主题

[C] 初学多线程,请教大家一个问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-23 09:07 |只看该作者 |倒序浏览
本帖最后由 liu_hacker 于 2010-11-23 09:25 编辑

循环创建多个线程,每个线程调用同一个函数,但是该函数是死循环,传的参数不同,为什么我只能创建第一个线程后就一直执行那个死循环,无法创建第二、第三。。。线程了呢?
  1. void *get_agent_attack(void * arg)
  2. {
  3.         struct  mysql_info *m_information;
  4.         m_information = (struct mysql_info *)arg;

  5.         sleep(2);
  6.         pthread_mutex_lock(&mut);
  7.         for(; ; )
  8.         {
  9.                 sleep(2);
  10.         printf("%s\n",m_information->ser_url);
  11.         printf("%s\n",m_information->my_user);
  12.         printf("%s\n",m_information->u_pass);
  13.         }
  14.         pthread_mutex_unlock(&mut);
  15.         //pthread_exit(NULL);
  16. }
  17. void thread_create(int agent_num)
  18. {
  19.         int temp,i;
  20.         memset(&thread, 0, sizeof(thread));
  21.         struct mysql_info my_info[MAX_NUM];
  22.         for(i=0;i<agent_num;i++ )
  23.         {
  24.                 my_info[i].ser_url = agent_ip[i];
  25.                 my_info[i].my_user = agent_db_user[i];
  26.                 my_info[i].u_pass = agent_db_pass[i];
  27.                 if((temp = pthread_create(&thread[i], NULL, get_agent_attack, (void *)&my_info[i])) != 0)
  28.                 {
  29.                         printf("Tread%d failed !\n",i);
  30.                 }
  31.                 else
  32.                 {
  33.                         printf("thread%d successful !\n",i);
  34.                 }
  35.                 if(thread[i] !=0)
  36.                 {
  37.                         pthread_join(thread[i], NULL);
  38.                 }
  39.                 //sleep(2);
  40.         }
  41. }

  42. main函数
  43.         pthread_mutex_init(&mut,NULL);
  44.         //printf("beagin\n");
  45.         int agent_num;
  46.         agent_num=get_agent_info();
  47.         //sleep(1);
  48.         thread_create(agent_num);
  49.         pthread_exit(NULL);
复制代码

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
2 [报告]
发表于 2010-11-23 09:18 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2010-11-23 09:33 |只看该作者
本帖最后由 csern 于 2010-11-23 09:34 编辑

回复 1# liu_hacker

你的代码是创建完一个就等待一个结束后再创建后一个

另外man pthread_create,有个很好的例子

论坛徽章:
0
4 [报告]
发表于 2010-11-23 09:35 |只看该作者
本帖最后由 liu_hacker 于 2010-11-23 09:38 编辑

回复 3# csern


    好像是这样,呵呵,不过我创建线程的多少,是根据在main函数中agent_num是数据库查的,那我该怎么创建呢?

论坛徽章:
0
5 [报告]
发表于 2010-11-23 14:25 |只看该作者
简单点的, 先直接创建完, 在全部等待所有线程退出, boost thread pool经常这么用, 但主要看你要求怎么退出线程

论坛徽章:
0
6 [报告]
发表于 2010-11-23 16:52 |只看该作者
本帖最后由 zzyong08 于 2010-11-23 16:54 编辑

pthread_join,等待一个线程,直到其退出,你在把它写和pthread_create写在同一个循环里,怎么可能执行下一个create呢?

把join拿到外面。或者干脆去掉。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP