转自:https://blog.csdn.net/qq_22847457/article/details/89371217
【嵌牛导读】本文介绍了Linux线程的相关信息
【嵌牛鼻子】Linux线程
【嵌牛提问】在了解Linux系统后,能否具体介绍线程的概念?
【嵌牛正文】
类Unix系统中,早期是没有“线程”概念的,80年代才引入,借助进程机制实现出了线程的概念。因此在这类系统中,进程和线程关系密切。一个进程可以有多个线程,这个进程本身也叫做线程只不过是主线程。通常主线程分配任务给子线程做。程序设计时候就可以某一时刻不止做一件事情,每一个线程处理各自独立的任务。
多个线程可以访问相同的存储地址空间和文件描述符。同一进程内的线程共享以下数据:全局内存、进程指令、打开的文件、信号处理函数和信号处置、当前工作目录、用户ID和用户组ID、大多数数据。每个线程有各自的线程ID、寄存器集合(包括程序计数器和栈指针)、栈、errono、信号掩码、优先级。
线程的优点有提高程序并发性、开销小和数据通信、共享数据方便等。线程的缺点有库函数不稳定、调试编写困难、gdb不支持、对信号支持不好等。除此之外,多线程内如果其中一个线程出现了 除0、野指针 等问题会造成该线程崩溃,进而导致整个进程终止。同时,线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出。
从上述分析来看,线程的优点相对突出,缺点均不是硬伤。Linux下由于实现方法导致进程、线程差别不是很大。
线程有一套完整的与其有关的函数库调用,它们中的绝大多数函数名都以pthread_开头。为了使用这些函数库调用,我们必须定义宏_REENTRANT,在程序中包含头文件pthread.h,并且在编译程序时需要用选项-lpthread来链接线程库。其中常用的函数库如下:
1. pthread_self函数获取线程ID,其作用对应进程中getpid()函数。
2. pthread_create函数创建一个新线程,其作用对应进程中fork()函数。
3. pthread_exit函数将单个线程退出,其作用对应进程中exit()函数
4. pthread_join函数阻塞等待线程退出,获取线程退出状态其作用,对应进程中waitpid()函数。
5. pthread_cancel函数杀死(取消)线程其作用,对应进程中kill()函数。
6. pthread_detach函数实现线程分离。
返回值:成功:0,错误:出错编号。
pthread不是Linux系统默认的库而是POSIX线程库。在Linux中将其作为一个库来使用,因此编译时需要加上-pthread以显式链接该库
返回线程ID
线程标识符在进程中是唯一的,即分别属于两不同进程的两个线程可能有相同的线程标识符
retval:返回信息
参数表:
thread: 要等待的线程的pid
retval:用来存储被等待线程的返回值
返回0:成功;返回错误号:失败
主线程阻塞自己,等待子线程结束,然后回收子线程资源
可以设置线程能否被取消和取消后是否立即执行
参数表
state:PTHREAD_CANCEL_DISABLE或者PTHREAD_CANCEL_ENABLE
oldstate:指针类型,上一次取消状态的指针,可设NULL
type:PTHREAD_CANCEL_ASYNCHRONOUS立即取消
PTHREAD_CANCEL_DEFERRED等待事件(如pthread_join时)才取消
在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死,只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。 因此为了避免内存泄漏,所有线程的终止,要么已设为DETACHED,要么就需要使用pthread_join()来回收
返回0成功,错误号失败
分离后不可以再合并。该 *** 作不可逆
综合以上要想让子线程总能完整执行(不会中途退出),
注:很多地方参照了黄茹老师主编的《Linux环境高级程序设计》
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)