01—线程基本API详解
一、进程ID和线程ID
(1)进程ID(pid_t):进程在系统中唯一的标识。getpid();
(2)线程ID(pthread_t):线程所属进程中,线程的唯一标识。它只在所属进程有效。pthread_self();
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二、线程相关API
(1)创建线程:
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
(2)函数参数:
thread : 指向pthread_t类型的指针,该地址将存放线程创建成功之后的线程ID。
attr : 线程的属性,一般不需要特殊的设置,所以一般简单的置空NULL,使用缺省属性。
start_routine : 函数指针,线程执行的函数
arg : 传递给线程执行函数的参数
(3)返回值:
成功 0
失败 出错码
(4)注意:
pthread_create 仅仅只是创建线程,至于线程何时运行取决于操作系统的调度。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(1)终止线程:
#include <pthread.h>
void pthread_exit(void *retval);
(2)函数参数:
retval : 线程的返回值(线程的退出状态),可以通过pthread_join函数回收
(3)注意:
retval 绝不能用它返回一个指向局部变量的指针,因为线程调用该函数后,这个局部变量就不存在了,这将引起严重的程序漏洞。
pthread_exit()相当于进程的exit();(线程中使用exit会结束整个进程,所有线程也会结束)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(1)等待线程终止:
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
(2)函数参数:
thread : 等待线程的线程id
retval : 不为NULL时,用于接收被等待的线程的返回值
一般此函数用在主线程中,等待通过thread指定的线程终止,此函数调用成功,可以通过value_ptr获取终止线程的返回值。
(3)注意:
如果等待的线程没有终止,此函数将引起调用者阻塞。如果等待的线程已终止,则立即返回。
(4)返回值:
成功 0
失败 返回错误码
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(1)取消线程:
#include <pthread.h>
int pthread_cancel(pthread_t thread);
(2)函数参数:
thread 要取消的线程的 ID
(3)返回值:
成功 0
失败 返回非0的数字
(4)注意:
线程通过调用pthread_cancel来请求取消同一个进程中正在运行的其他线程。
如果一个线程被取消,那pthread_join接受的线程返回值为
PTHREAD_CANCELED(#define PTHREAD_CANCELED ((void *) -1));
pthread_cancel并不等待线程终止,仅提出请求,线程可以选择忽略取消或控制如何被取消。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
三、总结整理
在不终止整个进程的情况下,可以有三种方式停止线程的工作流并退出。
(1)线程从其工作函数中返回,返回值是线程的退出码。 return
(2)线程可以被同一进程的其他线程取消。
(3)线程自己调用pthread_exit