请教一个关于pthread_create()传递最后一个参数的问题。

jxdz232601 2013-03-15 11:00:26
struct fun_argu;
while(循环6次){
... \\这里修改fun_argu的内容
pthread_create(id, attr, funname, &fun_argu);
}

这个情况中,函数调用,最后一个fun_argu是一个结构体,创建好后传给pthread_create,但是pthread_create最后一个参数传递的必须是个指针,所以我传了&fun_argu。

那问题就出现了,由于循环太快了,线程里面还没来得及用fun_argu,fun_argu就已经变了6次,导致最后6个线程使用的fun_argu都是一样的。

本来建fun_argu结构体,就是因为不能用全局变量,但是假如传入的是指针的话,那就和用全局变量差不多了。

一般用什么办法可以实现每次传进去的后线程使用的参数不一样?
...全文
526 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxdz232601 2013-03-15
  • 打赏
  • 举报
回复
引用 7 楼 wugui414 的回复:
引用 5 楼 jxdz232601 的回复: 引用 1 楼 wugui414 的回复:C/C++ code ? 1234567 while(循环6次){ struct fun_argu; // 放里面不就可以了 // TODO...这里修改fun_argu的内容 pthread_create(id, attr, funname, &a……
应该是一样的吧,而且我刚才还打印地址看了下的。
jxdz232601 2013-03-15
  • 打赏
  • 举报
回复
引用 6 楼 mymtom 的回复:
六个线程,当然要对不同的数据进行处理,搞个数组不就行了; 还有注意,线程没有结束是不要退出这个函数哦,否则局部变量就fun_argu[6]就释放了。 struct foo fun_argu[6]; for (i = 0; i < 6; ++i) { pthread_create(id, attr, funname, &fun_argu[i]); } pthread……
THX,对了,高频率的使用malloc和free是不是不可取啊。
wugui414 2013-03-15
  • 打赏
  • 举报
回复
引用 5 楼 jxdz232601 的回复:
引用 1 楼 wugui414 的回复:C/C++ code ? 1234567 while(循环6次){ struct fun_argu; // 放里面不就可以了 // TODO...这里修改fun_argu的内容 pthread_create(id, attr, funname, &amp;fun_argu); }……
肯定不一样~ 放在while里面,每循环一次都有一个新的fun_argu,所以每次的地址都不一样
mymtom 2013-03-15
  • 打赏
  • 举报
回复
六个线程,当然要对不同的数据进行处理,搞个数组不就行了; 还有注意,线程没有结束是不要退出这个函数哦,否则局部变量就fun_argu[6]就释放了。 struct foo fun_argu[6]; for (i = 0; i < 6; ++i) { pthread_create(id, attr, funname, &fun_argu[i]); } pthread_join
jxdz232601 2013-03-15
  • 打赏
  • 举报
回复
引用 1 楼 wugui414 的回复:
C/C++ code ? 1234567 while(循环6次){ struct fun_argu; // 放里面不就可以了 // TODO...这里修改fun_argu的内容 pthread_create(id, attr, funname, &fun_argu); }
貌似效果差不多吧。。
jxdz232601 2013-03-15
  • 打赏
  • 举报
回复
有这么几种做法了: (1)复制一份到堆里面。(2L,3L的做法) (2)加锁。(一般的做法) (3)用结构体数组。(我问了同事,他推荐我这个) (4)sleep.(直接pass这个)。 由于这个while循环外面其实还有一个死循环, 1秒钟大概循环接近100次。 那最好用哪种比较好?
qq120848369 2013-03-15
  • 打赏
  • 举报
回复
复制一份堆内存。
慕少艾 2013-03-15
  • 打赏
  • 举报
回复
给线程传参 还是传堆上的空间 安全些。
wugui414 2013-03-15
  • 打赏
  • 举报
回复


while(循环6次){
    struct fun_argu; // 放里面不就可以了
    // TODO...这里修改fun_argu的内容
    pthread_create(id, attr, funname, &fun_argu);
}
wugui414 2013-03-15
  • 打赏
  • 举报
回复
引用 9 楼 jxdz232601 的回复:
引用 7 楼 wugui414 的回复:引用 5 楼 jxdz232601 的回复: 引用 1 楼 wugui414 的回复:C/C++ code ? 1234567 while(循环6次){ struct fun_argu; // 放里面不就可以了 // TODO...这里修改fun_argu的内容 pthread_cre……
抱歉,误人子弟了,我妄加推测,结果是错了,sorry

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧