看看free 66666

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

2017年03月05日 16:09:12 黑帽子和猫 阅读数:3632更多

个人分类: 多线程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MonroeD/article/details/60468294

程序如下

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

    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)

猜你喜欢

转载自blog.csdn.net/lusic01/article/details/82877523
今日推荐