免费注册 查看新帖 |

Chinaunix

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

大家都是怎么给pthread_create()创建的线程函数传递参数的呀? [复制链接]

论坛徽章:
0
31 [报告]
发表于 2010-07-09 23:57 |只看该作者
既然这里用不到锁,这样的全局变量又有什么可怕的呢?所以没必要刻意避免这样的全局变量。
没本 发表于 2010-07-09 23:55



    不是讨论着玩嘛。

论坛徽章:
0
32 [报告]
发表于 2010-07-10 00:03 |只看该作者
不是讨论着玩嘛。
聪聪知不道 发表于 2010-07-09 23:57



    那你慢慢灌水,我先下了。。。

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
33 [报告]
发表于 2010-07-10 00:04 |只看该作者
其实我喜欢用指针,反正也不会传几个变量的

论坛徽章:
0
34 [报告]
发表于 2010-07-10 00:08 |只看该作者
那你慢慢灌水,我先下了。。。
没本 发表于 2010-07-10 00:03



    晚安

论坛徽章:
0
35 [报告]
发表于 2010-07-12 12:41 |只看该作者
学习了

论坛徽章:
0
36 [报告]
发表于 2010-07-12 13:06 |只看该作者
1,传递int,short,char这样少于一个指针长度的类型的,强转成(void *),然后在线程里转回来用就可以;
2, ...
聪聪知不道 发表于 2010-07-08 20:35



对于2,我觉得不能拘泥于函数,只要是在同一个功能块或者模块里实现对应的申请和释放,我觉得没什么大问题。

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

论坛徽章:
0
38 [报告]
发表于 2010-07-13 13:45 |只看该作者
最近我也碰到这个问题,我用方法2,不过在进入线程先把堆传递的的参数保存到线程的栈上,然后释放内存。
这样不论以后是线程主动退出,还是主线程杀死创建的线程,都没什么大问题。

论坛徽章:
1
天蝎座
日期:2014-02-28 16:08:53
39 [报告]
发表于 2010-07-13 15:31 |只看该作者
2分

论坛徽章:
0
40 [报告]
发表于 2010-07-13 19:28 |只看该作者
>> 2,传递多个参数的时候,创建线程的函数内malloc()一个结构体,把参数都放进去,然后传指针,线程函数结束时,在线程内部free();

关于传递多个参数, 一种比较通用的方法是为 pthread_create 做一次函数包装, 由包装函数完成一些繁锁的事情.
下面举例说明扩展成 3 个参数的例子, 之后调用 my_pthread_create() 即可处理多于一个参数的例子.
  1. typedef void * (*FUNCALLBACK)(void * arg1, void * arg2, void * arg3);
  2. typedef stuct {
  3.    FUNCALLBACK callback;
  4.    void * arg1;
  5.    void * arg2;
  6.    void * arg3;
  7. } ARGS;

  8. void * sub_thread_entry(void * arg)
  9. {
  10.     ARGS     args;
  11.    
  12.     /* retrieve args */
  13.     args.callback =  ((ARGS *)arg)->callback;
  14.     args.arg1 =  ((ARGS *)arg)->arg1;
  15.     args.arg2 =  ((ARGS *)arg)->arg2;
  16.     args.arg3 =  ((ARGS *)arg)->arg3;
  17.     free(arg);
  18.    
  19.     return args.callback(args.arg1, args.arg2, args.arg3);
  20. }     

  21. int my_pthread_create(pthread_t *thread, const pthread_attr_t *attr,
  22.         FUNCALLBACK start_routine, void *arg1, void * arg2, void * arg3)
  23. {
  24.     ARGS *    args;
  25.    
  26.     if (NULL == (args=(ARGS *)malloc(sizeof(ARGS))))
  27.         return -1;
  28.      
  29.     /* push args into buffer */
  30.     args->callback =  start_routine;
  31.     args->arg1 =  arg1;
  32.     args->arg2 =  arg2;
  33.     args->arg3 =  arg3;
  34.    
  35.     return pthread_create(pthread, attr, sub_thread_entry, args);
  36. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP