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

创建线程需要时间,这个线程还未创建完成时,如果参数指针的内存被释放了就会出问题,创建了线程后,加少量延时,或者传递申请malloc空间指针,在线程中释放。

程序如下

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)
 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pthread_create函数是用于创建一个新的线程的函数,它的原型如下: ```c int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); ``` 其中,最后一个参数arg就是用来传递给新线程参数。arg可以是任意类型的指针,通过它可以将需要传递给新线程的数据传递过去。 在新线程的入口函数start_routine中,可以通过强制类型转换将arg转换为需要的类型,然后使用该参数进行相应的操作。 下面是一个简单的示例代码,演示了如何使用pthread_create传递参数: ```c #include <stdio.h> #include <pthread.h> // 新线程的入口函数 void* thread_func(void* arg) { int num = *(int*)arg; // 将参数arg转换为int类型指针,并取值 printf("Received parameter: %d\n", num); // 在这里可以进行相应的操作 // ... pthread_exit(NULL); } int main() { pthread_t tid; int param = 123; // 需要传递给新线程参数 // 创建新线程,并传递参数 if (pthread_create(&tid, NULL, thread_func, &param) != 0) { printf("Failed to create thread.\n"); return 1; } // 等待新线程结束 if (pthread_join(tid, NULL) != 0) { printf("Failed to join thread.\n"); return 1; } return 0; } ``` 在上述示例中,我们创建了一个新线程,并将参数param传递给新线程。新线程的入口函数thread_func将参数转换为int类型,并打印出来。你可以根据实际需求修改入口函数和参数的类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值