01—线程基本API详解

一、进程ID和线程ID

(1)进程ID(pid_t):进程在系统中唯一的标识。getpid();

01—线程基本API详解
   

(2)线程ID(pthread_t):线程所属进程中,线程的唯一标识。它只在所属进程有效。pthread_self();
01—线程基本API详解
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

二、线程相关API

01—线程基本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 仅仅只是创建线程,至于线程何时运行取决于操作系统的调度。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

01—线程基本API详解

(1)终止线程:
    #include <pthread.h>
    void pthread_exit(void *retval);   

(2)函数参数:
    retval : 线程的返回值(线程的退出状态),可以通过pthread_join函数回收
(3)注意:
    retval 绝不能用它返回一个指向局部变量的指针,因为线程调用该函数后,这个局部变量就不存在了,这将引起严重的程序漏洞。

    pthread_exit()相当于进程的exit();(线程中使用exit会结束整个进程,所有线程也会结束)


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

01—线程基本API详解

(1)等待线程终止: 
    #include <pthread.h>
    int pthread_join(pthread_t thread, void **retval); 
(2)函数参数:
    thread : 等待线程的线程id
    retval : 不为NULL时,用于接收被等待的线程的返回值

一般此函数用在主线程中,等待通过thread指定的线程终止,此函数调用成功,可以通过value_ptr获取终止线程的返回值。

(3)注意:

    如果等待的线程没有终止,此函数将引起调用者阻塞。如果等待的线程已终止,则立即返回。

(4)返回值:
    成功 0
    失败 返回错误码
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

01—线程基本API详解

(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