现在的位置: 首页 > 综合 > 正文

多线程参数传递

2013年10月09日 ⁄ 综合 ⁄ 共 4859字 ⁄ 字号 评论关闭

Linux多线程编程的基本的函数

 1线程创建

    函数原型:

                   

#include <pthread.h>

int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg);

    返回值:若是成功建立线程返回0,否则返回错误的编号

    形式参数:

                pthread_t *restrict tidp 要创建的线程的线程id指针

                const pthread_attr_t *restrict attr 创建线程时的线程属性

                void* (start_rtn)(void) 返回值是void类型的指针函数

                vodi *restrict arg   start_rtn的行参

   例题1

       功能:测试建立一个新的线程

       程序名称: pthread_test.c

       

#include <pthread.h>

#include <stdio.h>

void *create(void *arg)

...{

    printf("new thread created ..... ");

    

}

int main(int argc,char *argv[])

...{

    pthread_t tidp;

    int error;

    error=pthread_create(&tidp,NULL,create,NULL);

    if(error!=0)

    ......{

        printf("pthread_create is not created ... ");

        return -1;

    }

    printf("prthread_create is created... ");

    return 0;

}

   

     编译方法:

#gcc -Wall -lpthread pthread_test.c

    因为pthread的库不是linux系统的库,所以在进行编译的时候要加上-lpthread,否则编译不过,会出现下面错误

thread_test.c: 在函数 ‘create’ 中:

thread_test.c:7: 警告: 在有返回值的函数中,程序流程到达函数尾

/tmp/ccOBJmuD.o: In function `main':thread_test.c:(.text+0x4f):对‘pthread_create’未定义的引用

collect2: ld 返回 1

    现在我们能建立了一个线程了,我们可以从函数的原型看到,在创建线程的时候,是可以在对我们的函数进行传递参数,在pthread_create的第四个行参。我们看一下例题2~3.

    例题2

    功能:向新的线程传递整形值

    程序名称:pthread_int.c

    

#include <stdio.h>

#include <pthread.h>

#include <unistd.h>

void *create(void *arg)

...{

    int *num;

    num=(int *)arg;

    printf("create parameter is %d  ",*num);

    return (void *)0;

}

int main(int argc ,char *argv[])

...{

    pthread_t tidp;

    int error;

    

    int test=4;

    int *attr=&test;

    

    error=pthread_create(&tidp,NULL,create,(void *)attr);

    if(error!=0)

    ...{

        printf("pthread_create is created is not created ... ");

        return -1;

    }

    sleep(1);

    printf("pthread_create is created is  created ... ");

    return 0;

}

    编译方法:

gcc -lpthread thread_int.c -Wall

    执行结果:

create parameter is 4

pthread_create is created is  created ...

    例题总结:

    可以看出来,我们在main函数中传递的整行指针,传递到我们新建的线程函数中。

    在上面的例子可以看出来我们向新的线程传入了另一个线程的int数据,线程之间还可以传递字符串或是更复杂的数据结构。

    例题3

    程序功能:向新建的线程传递字符串

    程序名称:thread_char.c

    

#include <pthread.h>

#include <stdio.h>

#include <unistd.h>

void *create(void *arg)

...{

    char *name;

    name=(char *)arg;

    printf("arg is %s  ",name);

    return (void *)0;

}

int main(int argc,char *argv[])

...{

    char *a="wang";

    int error;

    pthread_t tidp;

    error=pthread_create(&tidp,NULL,create,(void *)a);

    if(error!=0)

    ...{

        printf("pthread is not created  ");

        return -1;

    }

    sleep(1);

    printf("pthread is created... ");

    return 0;

}    

    编译方法:

gcc -Wall thread_char.c -lpthread

    执行结果:

arg is wang

pthread is created...

    例题总结:

    可以看出来main函数中的字符串传入了新建里的线程中。

    例题4

    程序名称:thread_struct.c

    

#include <stdio.h>

#include <pthread.h>

#include <unistd.h>

#include <stdlib.h> /**//*malloc()*/

struct test

...{

    int a;

    char *s;

};

void *create(void *arg)

...{

    struct test *temp;

    temp=(struct test *)arg;

    printf("test->a ==%d  ",temp->a);

    printf("test->s ==%s  ",temp->s);

    return (void *)0;

}

int main(int argc,char *argv[])

...{

    pthread_t tidp;

    int error;

    struct test *b;

    b=(struct test *)malloc(sizeof(struct test));

    b->a=4;

    b->s="wang";

    error=pthread_create(&tidp,NULL,create,(void *)b);

    if(error!=0)

    ...{

        printf("phread is not created... ");

        return -1;

    }

    sleep(1);

    printf("pthread is created... ");

    return 0;

}

    编译方法:

gcc -Wall -lpthread thread_struct.c

    执行结果:

test->a ==4

test->s ==wang

pthread is created...

    线程包含了标识进程内执行环境必须的信息。他集成了进程中的所有信息都是对线程进行共享的,包括文本程序、程序的全局内存和堆内存、栈以及文件描述符。

    例题5

    程序目的:验证新建立的线程可以共享进程中的数据

    程序名称:thread_share.c

    

#include <stdio.h>

#include <pthread.h>

#include <unistd.h>

static int a=4;

void *create(void *arg)

...{

    printf("new pthread ... ");

    printf("a==%d  ",a);

    return (void *)0;

}

int main(int argc,char *argv[])

...{

    pthread_t tidp;

    int error;

    a=5;

    error=pthread_create(&tidp,NULL,create,NULL);

    if(error!=0)

    ...{

        printf("new thread is not create ... ");

        return -1;

    }

    sleep(1);

    printf("new thread is created ... ");

    return 0;

}

    编译方法:

gcc -Wall -lpthread thread_share.c

    执行结果:

new pthread ...

a==5

new thread is created ...

    

    例题总结:可以看出来,我们在主线程更改了我们的全局变量a的值的时候,我们新建立的线程则打印出来了改变的值,可以看出可以访问线程所在进程中的数据信息。

    

    2、线程的终止

    如果进程中任何一个线程中调用exit_Exit,或者是_exit,那么整个进程就会终止,与此类似,如果信号的默认的动作是终止进程,那么,把该信号发送到线程会终止进程。

    线程的正常退出的方式:

       (1) 线程只是从启动例程中返回,返回值是线程中的退出码

       (2) 线程可以被另一个进程进行终止

       (3) 线程自己调用pthread_exit函数

    两个重要的函数原型:

    

#include <pthread.h>

void pthread_exit(void *rval_ptr);

/*rval_ptr 线程退出返回的指针*/

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

   /*成功结束进程为0,否则为错误编码*/

    例题6

    程序目的:线程正常退出,接受线程退出的返回码

    程序名称:exit_return.c

    

   #include <stdio.h>

#include <pthread.h>

#include <unistd.h>

void *create(void *arg)

...{

抱歉!评论已关闭.