Linux线程函数以及分离属性

pthread_create函数

  • 函数作用:
  • 创建一个新线程
  • 函数原型
  • int pthread_create(pthread_t *thread,

const pthread_attr_t *attr,

                void *(*start_routine) (void *),

  void *arg);

  • 返回值
  • 成功,返回0
  • 失败,返回错误号
  • 函数参数:
  • pthread_t:传出参数,保存系统为我们分配好的线程ID
  • 当前Linux中可理解为:typedef unsigned long int pthread_t。
  • attr:通常传NULL,表示使用线程默认属性。若想使用具体属性也可以修改该参数。
  • start_routine:函数指针,指向线程主函数(线程体),该函数运行结束,则线程结束。
  • arg:线程主函数执行期间所使用的参数。

pthread_exit函数

在线程中禁止调用exit函数,否则会导致整个进程退出,取而代之的是调用pthread_exit函数,这个函数是使一个线程退出,如果主线程调用pthread_exit函数也不会使整个进程退出,不影响其他线程的执行。

  • 函数描述
  • 将单个线程退出
  • 函数原型
  • void pthread_exit(void *retval);  
  • 函数参数
  • retval表示线程退出状态,通常传NULL

pthread_join函数

  • 函数描述:阻塞等待线程退出,获取线程退出状态。其作用,对应进程中的waitpid() 函数。
  • 函数原型:int pthread_join(pthread_t thread, void **retval);
  • 函数返回值:
  • 成功:0;
  • 失败:错误号
  • 函数参数:
  • thread:线程ID
  • retval:存储线程结束状态,整个指针和pthread_exit的参数是同一块内存地址。

pthread_detach函数

线程分离状态:指定该状态,线程主动与主控线程断开关系。线程结束后,其退出状态不由其他线程获取,而直接自己自动释放。网络、多线程服务器常用。

进程若有该机制,将不会产生僵尸进程。僵尸进程的产生主要由于进程死后,大部分资源被释放,一点残留资源仍存于系统中,导致内核认为该进程仍存在。

也可使用 pthread_create函数参2(线程属性)来设置线程分离。pthread_detach函数是在创建线程之后调用的。

  • 函数描述
  • 实现线程分离
  • 函数原型
  • int pthread_detach(pthread_t thread);      
  • 函数返回值
  • 成功:0;
  • 失败:错误号

一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join,这样的调用将返回EINVAL错误。也就是说,如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。

pthread_cancel函数

  • 函数描述
  • 杀死(取消)线程。其作用,对应进程中 kill() 函数。
  • 函数原型
  • int pthread_cancel(pthread_t thread);       
  • 函数返回值
  • 成功:0;
  • 失败:错误号

pthread_equal函数

  • 函数描述:
  • 比较两个线程ID是否相等。
  • 函数原型
  • int pthread_equal(pthread_t t1, pthread_t t2);

注意:这个函数是为了以能够扩展使用的, 有可能Linux在未来线程ID pthread_t 类型被修改为结构体实现。

进程函数和线程函数比较

进程

线程

fork

pthread_create

exit

pthread_exit

wait/waitpid

pthread_join

kill

pthread_cancel

getpid

pthread_self

  • 设置线程属性分为以下步骤

第1步:定义线程属性类型类型的变量

  • pthread_attr_t  attr;  

第2步:对线程属性变量进行初始化

  • int pthread_attr_init (pthread_attr_t* attr);

第3步:设置线程为分离属性

  • int pthread_attr_setdetachstate(

pthread_attr_t *attr,

int detachstate);

  • 参数:
  1. attr: 线程属性
  2. detachstate:
  1. PTHREAD_CREATE_DETACHED(分离)
  2. PTHREAD_CREATE_JOINABLE(非分离)

                 注意:这一步完成之后调用pthread_create函数创建线程,

                                     则创建出来的线程就是分离线程;其实上述三步就是

                                     pthread_create的第二个参数做准备工作。

第4步:释放线程属性资源

  • int pthread_attr_destroy(pthread_attr_t *attr);

参数:线程属性

你可能感兴趣的:(C++,多线程以及多协程,java,jvm,开发语言)