Unix POSIX线程

原创 2016年06月01日 14:48:36

当一个进程需要一个实体来完成某件事时,它可以fork一个子进程,让子进程去处理。Unix上大多网络服务器也是这么做的,但是fork有一些缺点:

1 昂贵,fork需要把父进程内存映像复制到子进程,并在子进程中复制所有的描述符,尽管有写时复制技术,但仍然昂贵。

2 父子进程之间需要进程间通信IPC,从子进程返回信息给父进程比较费力。


线程又称轻权进程,线程创建比进程快10-100倍。同一进程中的线程共享相同的全局内存,伴随的问题是同步问题

同一进程中的线程共享:

进程指令

大多数数据

打开的文件描述符

信号处理函数和信号处置

当前工作目录

用户id和组id

每个线程各有:

线程id

寄存去集合,包括程序计数器和栈指针

errno

信号掩码

优先级


pthread_creat函数

#include<pthread.h>
int pthread_creat(pthread_t *tid, const pthread_attr_t* attr,void*(*func)(void*),void* arg);

成功返回0,出错返回正的Exxx值

参数分别是线程id、线程属性(优先级、初始栈大小、是否成为守护线程)、该线程执行的函数及其函数参数。
出错情况例如:线程数量上超过某个系统限制而不能创建线程时,返回的错误指示是EAGAIN,注意phread_creat不设置errno。


pthread_join函数

#include<pthread.h>
int pthread_join(pthread_t *tid,void **status);
成功返回0,出错返回正值Exxx

pthread_join用来等待一个线程终止,相当于进程中的waitpid。

我们必须指定线程id,所以无法像waitpid那样指定-1来等待所有的线程。如果status非空,来自所等待的线程的返回值(一个指向某个对象的指针)将存入由status指向的位置。


pthread_self函数

#include<pthread.h>
pthread_t pthread_self(void);
返回线程的线程ID。

每个线程调用pthread_self返回线程id。类似于进程中的getpid();


pthread_detach函数

#include<pthread.h>
int pthread_detch(pthread_t tid);
成功返回0,出错返回正Exxx

一个线程是可汇合的,或者可分离的,当一个可汇合的线程终止时,它的线程和退出状态将留存到另一个线程对它调用pthread_join为止,脱离的线程像守护进程,当他们终止时,所有相关资源将被释放,我们不能等待它们终止。如果一个线程需要知道另一个线程什么时候终止,那最好保持第二个线程的可汇合状态。pthread_detch把一个线程转变为脱离状态。


pthread_exit函数

#include<pthread.h>
void pthread_exit(void *status);
不能返回到调用者,如果线程未曾脱离,它的线程id和退出状态将一直保留到调用进程内某个其他线程对它调用pthread_join为止。status不能指向局部与调用线程的对象,因为线程终止局部对象也消失。

线程终止的另外两个方法

启动线程的函数返回。其返回值void*就是线程的终止状态。

进程的main函数返回或者任何线程调用了exit,整个进程就终止,包括其内的任何线程。






版权声明:本文为博主原创文章,未经博主允许不得转载。

Unix、Posix和标准UniX规范

Unix、Posix和标准UniX规范
  • Quincuntial
  • Quincuntial
  • 2017年06月03日 18:14
  • 520

UNIX/Linux/BSD、POSIX、GNU

UNIX/Linux/BSD、POSIX、GNU
  • tfygg
  • tfygg
  • 2015年06月24日 11:15
  • 2081

POSIX 线程小结

POSIX 在IEEE Std 1003.1c-1995 (也称为POSIX 1995 或 POSIX.1c) 对线程库进行了标准化。开发人员称之为 POSIX线程,或简称为 Pthreads。Pth...
  • u012432778
  • u012432778
  • 2015年08月11日 13:11
  • 576

Unix/Linux的System V、BSD、Posix概念

1. System V和BSD  Unix操作系统在操作风格上主要分为System V和BSD(目前一般采用BSD的第4个版本SVR4),前者的代表的操作系统有Solaris操作系统,在Solaris...
  • qq_29344757
  • qq_29344757
  • 2017年11月28日 18:23
  • 277

POSIX线程库API(全)

http://blog.csdn.net/yangtaolyt/article/details/6939149 线程库 下面简要论述了特定任务及其相关手册页。 创建缺省线程 如果未指定...
  • cjsycyl
  • cjsycyl
  • 2013年03月22日 10:09
  • 795

Linux上posix线程库实现原理讨论 .

原文:来自论坛一处讨论http://bbs.chinaunix.net/thread-497496-2-1.html 说明一下,这个问题困扰我好长时间,因为正如使用C编程会希望了解进程的内存...
  • happylife1527
  • happylife1527
  • 2012年12月06日 13:47
  • 680

POSIX线程:API

Linux下的POSIX线程API:线程创建与撤销,线程私有数据,线程同步,线程终止等。...
  • dipperkun
  • dipperkun
  • 2011年04月09日 21:53
  • 3023

C++封装POSIX 线程库(六)线程池

线程池有两个主要组件: 1.threads 2.blocking queue 解决的问题是线程创建与销毁带来的开销和通过线程池实现伪异步 过程类似于简单的生产者消费者问题(详见wiki)B...
  • zhangxiao93
  • zhangxiao93
  • 2017年05月24日 16:58
  • 418

什么是posix

POSIX是Portable Operating System Interface for UNIX的首字母缩写词,是一套IEEE和ISO标准。这个标准定义了应用程序和操作系统之间的一个接口。只要保证...
  • hotdust
  • hotdust
  • 2007年12月04日 18:24
  • 653

POSIX && XSI

POSIX 表示可移植操作系统接口(Portable Operating System Interface )。电气和电子工程师协会(Institute of Electrical and Elect...
  • u012349696
  • u012349696
  • 2016年05月28日 16:16
  • 1109
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unix POSIX线程
举报原因:
原因补充:

(最多只允许输入30个字)