创建和结束线程
包括
-
pthread_create
:用于创建一个线程 -
pthread_exit
:线程函数结束时调用 pthread_exit 以便安全、干净地退出 -
pthread_join
:用于等待其他线程结束 -
pthread_cancel
:用于异常终止一个线程
pthread_create
用于创建一个线程
定义
#include <pthread.h>
int pthread_create( pthread_t* thread, const pthread_attr_t* attr, void* ( *start_routine )( void* ), void* arg );
参数
thread
:新线程的资源标识符,后续 pthread_* 函数通过它来引用新线程
pthread_t定义如下:
#include<bits/ pthreadtypes.h> typedef unsigned long int pthread_t;
pthread_t是一个整型类型
Linux上几乎所有的资源标识符都是整型数,比如socket和各种System V IPC标识符等
attr
:用于设置新线程的属性,如果为 NULL 则表示使用默认线程属性
start_routine
:新线程将运行的函数
线程创建后,内核就可以调度内核线程来执行start_routine函数指针所指向的函数
arg
:新线程将运行的函数的参数
返回值
成功时返回 0,失败时返回错误码
pthread_exit
线程函数结束时调用 pthread_exit 以便安全、干净地退出
定义
#include <pthread.h>
void pthread_exit( void* retval );
参数
retval
:pthread_exit 将通过 retval 参数向线程的回收者传递其退出信息
返回值
该函数执行完后不会返回到调用者;该函数不会失败
pthread_join
一个进程内的某个线程可以调用 pthread_join 来回收其他线程(如果该线程是可回收的),即等待其他线程结束
这类似于回收进程中的 wait 和 waitpid 系统调用
代码中如果没有pthread_join主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了。加入pthread_join后,主线程会一直等待直到等待的线程结束自己才结束,使创建的线程有机会执行。
该函数会一直阻塞,直到被回收的线程结束
定义
#include <pthread.h>
int pthread_join( pthread_t thread, void** retval );
参数
thread
:目标线程的标识符
retval
:目标线程返回的推出信息
返回值
成功时返回 0,失败时返回错误码
可能的错误码:
错误码 描述 EDEADLK (error : dead lock) 可能引起死锁。如两个线程互相针对对方调用pthread_join,或线程对自身调用 pthread_join EINVAL (error : invalid) 目标线程是不可回收的,或者已经有其他线程在回收该目标线程 ESRCH 目标线程不存在
pthread_cancel
用于取消一个线程,或者说异常终止一个线程
定义
#include <pthread.h>
int pthread_cancel( pthread_t thread );
参数
thread
:目标线程的标识符
返回值
成功时返回 0,失败时返回错误码
接收到取消请求的目标线程可以决定是否允许被取消以及如何取消,分别由下面两个函数完成:
1.pthread_setcancelstate
决定本线程是否允许被取消
定义
#include <pthread.h> int pthread_setcancelstate( int state, int *oldstate );
参数
state
:设置线程是否允许被取消,有两个可选值:PTHREAD_CANCEL_ENABLE:允许线程被取消,它是线程被创建时默认的取消状态
PTHREAD_CANCEL_DISABEL:禁止线程被取消,这时如果一个线程收到取消请求,则它会将请求挂起,直到该线程允许被取消
oldstate
:用来记录线程原来的取消状态返回值
成功时返回 0,失败时返回错误码
2.pthread_setconceltype
#include <pthread.h> int pthread_setcanceltype( int type, int *oldtype );
参数
type
:取消类型,用于设置线程如何被取消。有两个可选值:PTHREAD_CANCEL_DEFERRED:默认类型允许目标线程推迟行动,直到它调用了几个所谓的取消点函数中的一个( 包括pthread_join、pthread_testcancel、pthread_cond_wait、pthread_cond_timewait、sem_wait 和 sigwait )
PTHREAD_CANCEL_ASYNCHRONOUS:线程随时可以被取消,它将使得接收到取消请求的目标线程立即行动
返回值
成功时返回 0,失败时返回错误码
网友评论