1.相同进程环境下比较线程id
int pthread_equal(pthread_t tid1, pthread_t tid2);
2.线程获取自身id
pthread_t pthread_self(void);
3.线程创建
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void), void *restrict arg);
关于主线程和新线程之间的竞争,简单处理方式是可使主线程进行短暂休眠,确保新线程运行前主线程不会退出。
新线程有可能在pthread_create函数返回前就开始运行。此时tidp有可能未经初始化,因此,若新线程要使用线程id,需通过pthread_self获取,而不能简单通过全局变量方式或者参数传递方式传递新线程id。
Linux系统使用clone系统调用创建子进程,来实现pthread_create。
4.线程终止
如果进程中任一线程调用了exit, _Exit, _exit,那么整个进程就会终止。
将默认动作是终止进程的信号发送给线程,将终止线程所在整个进程。
单个线程可以以以下三种方式,在不终止整个进程的情况下退出:
(1)线程只是从启动例程中返回,同时返回线程退出码;
(2)线程被同一进程的其他线程取消;
(3)线程调用pthread_exit;
void pthread_exit(void *rval_ptr);
进程中其他线程可以通过调用pthread_join,阻塞等待指定线程,直到被指定线程调用pthread_exit、 从启动例程中返回或被取消。
int pthread_join(pthread_t thread, void **rval_ptr);
同一进程环境下,线程可通过调用pthread_cancel函数来取消其他线程。
int pthread_cancel(pthread_t tid);
pthread_cancel并不等待线程终止,仅提出请求。(函数的返回值仅表示请求是否成功,而不表示指定线程是否真实终止?)
5.线程清理处理程序
void pthread_cleanup_push(void (*rtn)(void *), void *arg);
void pthread_cleanup_pop(int execute);
以下情况时调用清理函数:
(1)线程调用pthread_exit;
(2)线程响应取消请求时;
(3)非零execute参数调用pthread_cleanup_pop;
注意:如果线程由启动例程中返回而终止,则不会调用清理处理程序。
如果execute为0,则清理函数将不被调用;但无论ececute是否为0,pthread_cleanup_pop都将删除上次pthread_cleanup_push所注册的清理处理程序。
注意,若pthread_cleanup_pop与pthread_cleanup_push以宏定义方式实现,则其必须在与线程相同的作用域中以匹配对的形式来使用。(宏定义中可能出现{、}字符,防止编译错误)
6.默认情况下,线程的终止状态将保存至对该线程调用pthread_join。pthread_join可主动使线程进入分离状态。分离状态下线程的底层存储资源可以在线程终止时立即被回收。
分离状态下的线程进行pthread_join调用会产生失败。
pthread_detach函数可以使线程进入分离状态。
int pthread_detach(pthread_t tid);