线程的故事——附2:线程建立函数参数void *arg深入分析

                             

                            线程建立函数参数void *arg深入分析

如果const pthread_attr_t *attr相当于老板招募的职工所具有的业务素质的话,那void *arg就相当于老板能提供给职工的工作条件了。

function:int pthread_create(pthread_t *tid, const pthread_attr_t *attr, (void*)(*start_rtn)(void*), void *arg);

第四个参数要求传入的值为一个指针,也即数据的地址。

  • 单数据传递
int err;
int param = 1;
pthread_t tid;
err = pthread_create(&tid, NULL, myprint, &param);
if (err != 0){
   printf("can't create thread: %s\n", strerror(err));
   return EXIT_FAILURE;
}
  • 多数据传递

第四个参数只能传入唯一的一个指针,如果有多个数据,怎么传入呢?

打包!用什么工具能把不同数据类型打包到一起呢?

结构体!

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>


typedef struct struct_mypara
{
    int para1;//参数1
    int para2;//参数2
}MyParaStruct;

void* myprint(void* para){
    
    //1.将线程置位分离的,运行结束自动释放资源
    //pthread_detach(pthread_self());
    //2.拿到入参,强转为初始类型指针
    MyParaStruct para0 = (MyParaStruct)(*((MyParaStruct*)para));
    //输出入参
    printf("para1 = %d.\n", para0.para1);
    printf("para2 = %d.\n", para0.para2);
    
    return;
}

int main(void)
{
    int err;
    pthread_t tid;
    MyParaStruct mypara = {1,2};
    err = pthread_create(&tid, NULL, myprint, &mypara); 
    if (err != 0){
        printf("can't create thread: %d.\n", strerror(err));
        return EXIT_FAILURE;
    }
    printf("new thread id = %lu.\n", tid);

    pthread_join(tid,NULL);
    return EXIT_SUCCESS;
}

运行环境:ubuntu14.04,平台自带gcc编译器

运行结果:

root@ubuntu:/home/jack# make
gcc -o test test.c -lpthread
root@ubuntu:/home/jack# ./test
new thread id = 3076188992.
para1 = 1.
para2 = 2.
root@ubuntu:/home/jack# 

测试程序下载地址:https://download.csdn.net/download/sleeping_sunshine/11579958

以上就是线程建立函数第四个参数void *arg的大体使用方法,如果您觉得有帮助或者有疑问的话,欢迎留言哦~

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值