线程的故事——附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, ¶m);
if (err != 0){
   printf("can't create thread: %s\n", strerror(err));
   return EXIT_FAILURE;
}
  • 多数据传递

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

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

结构体!

#include 
#include 
#include 


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的大体使用方法,如果您觉得有帮助或者有疑问的话,欢迎留言哦~

你可能感兴趣的:(线程的故事,C语言,线程,pthread_create,arg0,线程参数)