程序如下
void* thread_rountine(void *arg)
{
int *cnt = (int*)arg;
for (int i=0; i<5; ++i)
printf("%d-hello\n",*cnt);
return 0;
}
int main(void)
{
pthread_t pid[2];
int ret;
for (int i=0; i<2; ++i)
{
if ( (ret=pthread_create(&pid[i],NULL,thread_rountine1,(void*)&i)) != 0)
{
fprintf(stderr,"pthread_create:%s\n",strerror(ret));
exit(1);
}
}
for (int i=0; i<2; ++i)
{
if (pthread_join(pid[i],NULL) != 0)
{
fprintf(stderr,"pthread_join:%s\n",strerror(ret));
exit(1);
}
}
return 0;
}
输出结果如下
2-hello
2-hello
2-hello
2-hello
2-hello
2-hello
2-hello
2-hello
2-hello
2-hello
正常情况下应该是5个”1-hello”,5个”2-hello”,为什么会这样呢?
解释:
新创建的thread1、thread2在还没有取到i的值时,i就被主线程更改为2了。避免直接在传递的参数中传递发生改变的量,否则会导致结果不可测
可以如下解决
void* thread_rountine1(void *arg)
{
int cnt = *((int*)arg);
free(arg);
for (int i=0; i<5; ++i)
printf("%d-hello\n",cnt);
return 0;
}
int main(void)
{
pthread_t pid[3];
int ret;
for (int i=0; i<3; ++i)
{
int *p = malloc(sizeof(int));
*p = i;
if ((ret=pthread_create(&pid[i],NULL,thread_rountine1,(void*)p)) != 0)
{
fprintf(stderr,"pthread_create:%s\n",strerror(ret));
exit(1);
}
free(p); //在原代码上增加释放内存操作,因为pthread_join不会释放手动申请的内存
p = NULL; //防止野指针
}
for (int i=0; i<3; ++i)
{
if ((ret=pthread_join(pid[i],NULL)) != 0)
{
fprintf(stderr,"pthreads_join",strerror(ret));
exit(1);
}
}
return 0;
}
可以看见解决办法就是重新申请一块内存,
另外注意perror()检查的是全局的errno变量,所以用strerror(errno)
————————————————
版权声明:本文为优快云博主「黑帽子和猫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/MonroeD/article/details/60468294