免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
41 [报告]
发表于 2010-07-14 20:42 |只看该作者
>> 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.

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

  23. int my_pthread_create(pthread_t *thread, const pthread_attr_t *attr,
  24.         FUNCALLBACK start_routine, void *arg1, void * arg2, void * arg3)
  25. {
  26.     ARGS *    args;
  27.   
  28.     if (NULL == (args=(ARGS *)malloc(sizeof(ARGS))))
  29.         return -1;
  30.      
  31.     /* push args into buffer */
  32.     args->callback =  start_routine;
  33.     args->arg1 =  arg1;
  34.     args->arg2 =  arg2;
  35.     args->arg3 =  arg3;
  36.   
  37.     return pthread_create(pthread, attr, sub_thread_entry, args);
  38. }

复制代码


newzy 发表于 2010-07-13 19:28


好华丽的方法,奈斯

论坛徽章:
0
42 [报告]
发表于 2010-07-14 20:47 |只看该作者

论坛徽章:
0
43 [报告]
发表于 2010-07-15 11:03 |只看该作者
用外部变量,定义成数组,每个线程编号做下标
hellioncu 发表于 2010-07-08 21:26



    要使用全局变量吗~。小时候老师就告诉我们不哟轻易使用goto,但是现在我在用了;他还告诉我们不要随便全局变量,但是个还一直没突破~~!

论坛徽章:
0
44 [报告]
发表于 2010-09-13 11:43 |只看该作者
用外部变量,定义成数组,每个线程编号做下标
hellioncu 发表于 2010-07-08 21:26



    看到大牛在很多个关于多线程的帖子里面进行回复,看来应该是个很大的大牛了。呵呵

在这再请教一下你这个方法的具体意思。

>>用全局变量,定义成数组
你的意思是这个数组的每一个元素是一个指针,指向在创建函数里面已经malloc好的内存的地址,是吧?

>>每个线程编号做下标
这句话是什么意思呢?

还有,按照这个方法,一旦某个线程是detched的状态,那么创建函数无法准确的知道这个线程函数何时执行完毕,
那么该如何进行free呢?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
45 [报告]
发表于 2010-09-13 11:50 |只看该作者
看到大牛在很多个关于多线程的帖子里面进行回复,看来应该是个很大的大牛了。呵呵

在这再请教 ...
pinecrane 发表于 2010-09-13 11:43



    用全局数组就用栈变量,不用malloc。实在不行用malloc,也没必要用全局数组了,可在线程函数中循环退出后释放

论坛徽章:
0
46 [报告]
发表于 2010-09-13 12:33 |只看该作者
用全局数组就用栈变量,不用malloc。实在不行用malloc,也没必要用全局数组了,可在线程函数中循 ...
hellioncu 发表于 2010-09-13 11:50



还是有点没太明白啊。

是不是下面这样?

全局数组里面的每一个元素是一个结构体(不用malloc的),这个结构体的元素保是需要传递到线程函数的参数。
当启动某个线程后,传递参数的时候,传递的不是这个结构体数组,传递的是对应于数组下标的线程编号?
这样就相当于避免使用malloc了,也就避免了malloc/free的问题了。

论坛徽章:
0
47 [报告]
发表于 2010-09-13 18:13 |只看该作者
回复 46# pinecrane


   大牛们怎么没有给具体讲解的呢?

论坛徽章:
0
48 [报告]
发表于 2010-09-18 14:40 |只看该作者
就是啊!!!大牛们具体讲解一下,小弟也好学习一把!!!!!!
跪求大牛们讲解!!!!!

论坛徽章:
0
49 [报告]
发表于 2010-09-18 15:14 |只看该作者
很多种方法

论坛徽章:
0
50 [报告]
发表于 2012-12-10 09:45 |只看该作者
回复 38# azfa123 请问下,怎么保存到线程的栈上?能详细的说下么?不太明白。谢谢


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP