首页 > 学院 > 开发设计 > 正文

pthread_create传递线程参数需要注意的问题

2019-11-06 07:11:29
字体:
来源:转载
供稿:网友

程序如下

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-hello2-hello2-hello2-hello2-hello2-hello2-hello2-hello2-hello2-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); } } 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)


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表