C语言pthread_create传递带多个参数的函数& pthread_join

pthread_create是类Unix操作系统(Unix、Linux、Mac OS X等)的创建线程的函数,头文件在pthread.h中。函数的声明如下:

int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,
(void*)(*start_rtn)(void*),void *arg);
//返回值:若成功则返回0,否则返回错误编号

参数
第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。

从第三个函数可以看到,传入的函数参数需要为void*类型。但是很多情况下需要线程处理的函数是多参数的。可以通过把参数封装成结构体的方式来实现传递带多个参数的函数。

struct fun_para
{
       var para1;//参数1
       var para2;//参数2
       .......
}

将这个结构体指针,作为void *形参的实际参数传递

struct fun_para para;
pthread_create(&ntid, NULL, thr_fn,¶);

接着在线程的调用函数thr_fn中可以通过下面的方式使用通过para传入的参数。

void *thr_fn(void *arg)
{
       fun_para *para;
       para = (fun_para *) arg;
       para->para1;//参数1
       para->para2;//参数2    
       ......
       //pthread_exit(0);
       return ((void *)0);
}

Additional Mark: 代码中如果没有pthread_join,主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了。加入pthread_join后,主线程会一直等待直到等待的线程结束自己才结束,使创建的线程有机会执行。
函数定义:

int pthread_join(pthread_t thread, void **retval);

描述 : pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。
参数: thread: 线程标识符,即线程ID,标识唯一线程。retval: 用户定义的指针,用来存储被等待线程的返回值。
返回值 : 0代表成功。 失败,返回的则是错误号。

    tmp1 = pthread_join(tid, &retval);
    if (tmp1 != 0)
    {
        printf("cannot join with thread1\n");
    }

你可能感兴趣的:(C语言,unix,多线程,c语言)