Chinaunix首页 | 论坛 | 博客
  • 博客访问: 848039
  • 博文数量: 143
  • 博客积分: 455
  • 博客等级: 一等列兵
  • 技术积分: 861
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-03 00:11
文章分类

全部博文(143)

文章存档

2018年(10)

2017年(6)

2016年(28)

2015年(14)

2014年(67)

2013年(1)

2012年(17)

我的朋友

分类: LINUX

2014-01-05 21:27:46

当创建线程的时候如果创建线程的函数会用jion等待子线程的时候,可以用指针传参,这时候主线程函数的所有内容还存在,获取该地址的内容也不会出错。但是如果不需要等待子线程结束而直接向下运行的时候,传参就有可能出现问题,就是创建线程的函数执行完成后,其所占的空间会被释放而值被改变,而创建的线程此时会根据参数地址去取其值,但是此空间已经被改变,所以再取内容会出错。

例:
int main()
{
 int i=0;
 int num = 0;
 while(i<100)
 {
  i++;
  if(i==5)
  {
   add_fun(i);
  }
 }
}
void add_fun(int k)
{
 pthread_t pid;
 pthread_create(&pid, NULL, addtion, (void *)&k);
}
void *addtion(void *ii)
{
 int *dd = (int *)ii;
 printf("i is %d\n", *dd);
}
此时,创建线程的时候,会将add_fun函数中k的地址传给线程,此时ii获取的是k的地址,然后赋给dd,此时add_fun函数已经执行完,其中k的值可能已经被改变,此时ii是获取的k的地址,所以打印其值就不是之前传进去的5了,所以会发生实际值和自己想的不一样,但是在add_fun函数中加一个pthread_jion();函数就可以一直等这不会执行完。
 
下面针对以上问题的解决就是直接传值,不再传递指针
int main()
{
 int i=0;
 int num = 0;
 while(i<100)
 {
  i++;
  if(i==5)
  {
   add_fun(i);
  }
 }
}
void add_fun(int k)
{
 pthread_t pid;
 pthread_create(&pid, NULL, addtion, (void *)k);
}
void *addtion(void *ii)
{
 int dd = (int)ii;
 printf("i is %d\n", dd);
}
这个相当于直接把k的值传进来了,然后直接用dd获取ii的值。就可以了
转载自:http://blog.chinaunix.net/uid-20798022-id-117209.html
阅读(3786) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~