Linux 创建线程

来源:互联网 发布:fastcopy的软件 编辑:程序博客网 时间:2024/05/22 10:50

返回值:成功返回0,失败返回错误号。以前学过的系统函数都是成功返回0,失败返回-1,而错误号保存在全局变量errno中,而pthread库的函数都是通过返回值返回错误号,虽然每个线程也都有 一个errno,但这是为了兼容其它函数接口而提供的,pthread库本身并不使用它,通过返回值返回错误码更加清晰。


在一个线程中调用pthread_create()创建新的线程后,当前线程从pthread_create()返回继续往下执行,而新的线程所执行的代码由我们传给pthread_create的函数指针start_routine决 定。start_routine函数接收一个参数,是通pthread_create的arg参数传递给它的,该参数的类型为void *,这个指针按什么类型解释由调用者自己定义。start_routine的返回值类型也是void *,这个指针的含义同样由调用者自己定义。start_routine返回时,这个线程就退出了,其它线程 可以调用
pthread_join得到start_routine的返回值,类似于父进程调用wait(2)得到子进程的退出 状态。


pthread_create成功返回后,新创建的线程的id被填写到thread参数所指向的内存单元。我们知道进程id的类型是pid_t,每个进程的id在整个系统中是唯一的,调用getpid(2)可以获得当前进程的id,是一个正整数值。线程id的类型是thread_t,它只在当前进程中保证是唯一的,在不同的系统中thread_t这个类型有不同的实现,它可能是一个整数值,也可能是一个结构体,也可能是一个 地址,所以不能简单地当成整数用printf打印,调⽤用pthread_self(3)可以获得当前线程的id。attr参数表示线程属性,本章不深入讨论线程属性,所有代码例子都传NULL给attr参数,表示线程属性取缺省值
如下是实例:

#include<stdio.h>#include<stdlib.h>#include<pthread.h>void* pthread_run(void* val){printf("%s:pid is %d, id is %u\n",(char*)val,(int)getpid(),(unsigned long long)pthread_self());return NULL;}pthread_t id;int main(){int err=pthread_create(&id,NULL,pthread_run,"other pthread run");if(err!=0){printf("create pthread error!info is %s\n",strerror(err));exit(err);}else{printf("main pthread run:pid is %d,id is %u\n",(int)getpid(),(unsigned long long)pthread_self());}sleep(1);return 0;}


0 0