1、pthread_create( ):
函数原型:
int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,void *(*start_rtn)(void*),void *arg);
创建一个具有指定参数的线程。
返回值含义:若线程创建成功,则返回0。若线程创建失败,则返回出错编号
tidp:指向线程标识符的指针。(作为参数传出,也就是pthread_t声明的变量)
attr:用来设置线程属性。(通常是NULL)
第三个参数,函数原型是void *(*start_rtn)(void*),是线程运行函数的起始地址,也就是线程运行时调用的函数
arg:给线程运行时调用的函数传递的参数
2、pthread_join( )
函数原型:
int pthread_join(pthread_t thread, void **retval);
以阻塞的形式等待线程结束,pthread_create是创建线程后执行,pthread_join让主线程阻塞,等待pthread_create创建的线程执行完毕之后,解除阻塞
返回值含义:
参数含义:
thread:线程ID,pthread_create的第一个参数
retval: 用户定义的指针,用来存储被等待线程的返回值。
3、pthread_exit()
void pthread_exit(void *retval);
线程函数在结束时调用此函数,以确保安全、干净地退出。
参数含义:
retval是函数的返回指针,只要pthread_join中的第二个参数retval不是NULL,这个值将被传递给retval。pthread_exit函数通过retval参数向线程的回收者传递其退出信息。他执行完之后不会返回到调用者,而且永远不会失败。
4、pthread_cancel()
int pthread_cancel(pthread_t thread);
取消某个线程的执行。
返回值含义:若是成功返回0,否则返回错误的编号。
参数含义:
thread是要取消线程的标识符ID。
但是,接收到取消请求的目标线程可以决定是否允许被取消以及如何取消,这分别由如下两个函数完成。
int pthread_setcancelstate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);
[pthread_setcancelstate]的第一个参数用于设置线程的取消状态(是否允许取消),第二个参数则记录线程原来的取消状态.
state参数有两个可选值:
PTHREAD_CANCEL_CNABLE,允许线程被取消。它是线程被创建时的默认取消状态。
PTHREAD_CANCEL_DISABLE,禁止线程被取消。这种情况下,如果一个线程收到取消请求,则它会将请求挂起,直到该线程允许被取消。
[pthread_setcanceltype]的第一个参数用于设置线程的取消类型(如何取消),第二个参数则记录线程原来的取消类型.
type参数也有两个可选值:
PTHREAD_CANCEL_ASYNCHRONOUS,线程随时都可以被取消。它将使得接收到取消请求的目标线程立即采取行动。
PTHREAD_CANCEL_DEFERRED,允许目标线程推迟行动,直到它调用了下面几个所谓的取消点函数中的一个:pthread_join、pthread_testcancel、pthread_cond_wait、pthread_cond_timedwait、sem_wait和sigwait。根据POSIX标准,其他可能阻塞的系统调用,比如read、wait,也可以成为取消点。不过为了安全起见,最好在可能会被取消的代码中调用pthread_testcancel函数设置取消点。
5、pthread_detach( )
int pthread_detach (pthread_t thread);
子线程从父线程独立出来,子线程结束后,资源自动回收
返回值含义:若是成功返回0,否则返回错误的编号。
参数含义:
thread是要释放线程的标识符ID。
说明:
其他说明:linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态。一个线程默认的状态是joinable,如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时,都不会释放线程所占用堆栈和线程描述符(总计8K多),只有当调用了pthread_join之后这些资源才会被释放。若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己设置,如:pthread_detach(pthread_self()),将状态改为unjoinable状态,确保资源的释放。如果线程状态为joinable,需要在之后适时调用pthread_join。
6、thread_self ();
pthread_t pthread_self (void);
获取当前调用线程的线程ID。
返回值含义:当前线程的线程ID标识。
7、pthread_start()
开始一个线程(是一个线程处于就绪状态,具体开始时间取决于cup)
start、run的区别
start:
start() 方法则是 Thread 类的方法,用来异步启动一个线程,然后主线程立刻返回。该启动的线程不会马上运行,会放到等待队列中等待 CPU 调度,只有线程真正被 CPU 调度时才会调用 run() 方法执行。即使一个线程处于就绪状态,随时由cup开始
run:
Thread 类也是实现了 Runnable 接口,而 Runnable 接口定义了唯一的一个 run() 方法,所以基于 Thread 和 Runnable 创建多线程都需要实现 run() 方法,是多线程真正运行的主方法。
继承【pthread】和重写【runable】的【run方法】两种创建线程方式区别:
前者必须继承【pthread】类,调用sart方法其实最终也是调用【run】方法,【start】方法只是异步效果而对【run】的封装。