热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UNIX高级环境编程第11、12章线程及其属性

第11章线程11.2线程概念线程资源:线程ID,一组寄存器,栈,调度优先级和策略,信号屏蔽字,e
第11章 线程

11.2 线程概念

线程资源:
线程ID,一组寄存器,栈,调度优先级和策略,信号屏蔽字,errno变量,线程私有数据。
进程的共享资源:
进程的可执行代码,全局内存,堆内存,栈和文件描述符

11.3 线程标识

int pthread_equal(pthread_t tid1, pthread_t tid2);int pthread_self();

Linux使用无符号长整形表示pthread_t

11.4 线程创建

int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr,void *(start_rtn(void*)), void* restrict arg);

在调用失败后,返回错误码,而不是设置errno

11.5 线程终止

如果进程中任意线程调用了exit、_Exit或者_exit,那么整个进程就会终止。
单个线程可以通过3种方式退出,因此可以在不终止整个进程的情况下,停止它的控制流:

  • 线程可以简单地从启动例程中返回,返回值是线程的退出码

  • 线程可以被同一进程中的其他线程取消

  • 线程调用pthread_exit

void pthread_exit(void *rval_ptr);

int pthread_join(pthread_t thread,void **rval_ptr);

调用pthread_join后,调用线程将一直阻塞,直到指定的线程退出。利用rval_ptr_ptr 访问 rval_ptr

int pthread_cancel(pthread_t tid);

线程可以通过调用pthread_cancel函数来请求取消同一进程中的其他进程。
pthread_cancel并不等待线程终止,它仅仅提出请求,线程可以选择
忽略取消或者控制如何被取消。

void pthread_cleanup_push(void (*rtn)(void *),void *arg);
void pthread_cleanup_pop(int execute);

1 .线程可以安排它退出时需要调用的函数,这与进程在退出时可以用atexit函数安排退出时类似的。
2. 如果线程是通过从它的启动例程中退出返回而终止的话,它的清理处理程序就不会被调用。
3. rtn函数并不是只有在线程结束时,才会被调用。参看第四条
4. 如果pthread_cleanup_pop被调用且execute参数设置为非0,则[调用并删除]上次pthread_cleanup_push调用建立的清理处理程序。如果execute参数为0,则清理函数将不被调用(只删除)。

进程线程函数的相似之处

第12章 线程属性

12.2 线程限制

12.3 线程属性

  • 线程的分离状态属性
    PTHREAD_CREATE_DETACHED
    PTHREAD_CREATE_JOINABLE (默认)

  • 线程栈的最低地址

  • 线程栈的大小

  • 线程栈末尾的警戒缓冲区大小

  • 可取消状态
    PTHREAD_CANCEL_ENABLE(默认)
    PTHREAD_CANCEL_DISABLE

  • 可取消类型
    PTHREAD_CANCEL_DEFERRED(默认)
    PTHREAD_CANCEL_ASYNCHRONOUS

int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);

如果不想了解现有某个线程的终止状态,可以使用pthread_detach函数让操作系统在线程退出时候收回它所占用的资源。
创建线程时候可以修改pthread_attr_t结构中的detachstate线程属性,让线程以分离状态启动。
detatchstate值:

  • PTHREAD_CREATE_DETACHED: 分离状态启动

  • PTHREAD_CREATE_JOINABLE 正常启动,应用程序可以获取线程的终止状态

int pthread_attr_setstack(pthread_attr_t *attr,void *stackaddr, size_t stacksize);
int pthread_attr_getstack(pthread_attr_t *attr,void **stackaddr, size_t *stacksize);

尽量使用 pthread_attr_setstacksize, 除非线程对栈的地址空间有特殊要求

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);

linux3.2.0 线程的默认栈空间为8MB,可以设定的最小栈空间为16KB

int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);

1. guardsize控制着线程栈末尾之后用以避免栈溢出的扩展内存的大小。当栈指针溢出到警戒区时,应用程序接受到出错信息
2. 若利用pthread_attr_setstack,系统认为我们将自己管理栈,进而使栈警戒缓冲区机制无效,相当于guardsize等于0
3. linux guardsize的默认大小为4KB,

int pthread_setcancelstate(int stat,int *oldstate);
若成功,返回0;否则,返回错误编号

1.调用该函数且stat为PTHREAD_CANCEL_DISABLE后,取消请求处于挂起状态。当取消状态再次变为PTHREAD_CANCLE_ENABLE时,
线程将在下一个取消点上对所有的取消请求进行处理。
2.pthread_cancel(tid)调用并不等待线程终止。在默认情况下,线程tid在取消请求发出以后还是继续运行,直到线程达到某个取消点。

void pthread_testcancel(void);
可以调用pthread_testcancel函数在程序中添加自己的取消点

int pthread_setcanceltype(int type,int *oldtype);

type参数可以是PTHREAD_CANCEL_DEFERRED(默认),也可以是PTHREAD_CANCEL_ASYNCHRONOUS(异步取消)。
如果使用异步取消。线程可以在任意时间撤销(linux上一般接收到信号便结束),而不是遇到取消点才能被取消。



推荐阅读
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了一个线程多次调用一个函数相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Linux_多线程(进程与线程的联系_pthread库_线程创建_线程等待_线程正常终止_线程取消_线程分离_pthread_t与LWP)
    Linux_多线程(进程与线程的联系_pthread库_线程创建_线程等待_线程正常终止_线程取消_线程分离_pthread_t与LWP)-文章目录1.线程的定义,进程和线程 ... [详细]
  • burp爆破线程设置多少_Linux中的线程局部存储解析
    在Linux系统中使用CC进行多线程编程时,我们遇到最多的就是对同一变量的多线程读写问题,大多情况下遇到这类问题都是通过锁机制来处理,但这 ... [详细]
  • 临界|被覆_Linux下线程同步(带你了解什么是互斥锁死锁读写锁条件变量信号量等)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Linux下线程同步(带你了解什么是互斥锁死锁读写锁条件变量信号量等)相关的知识,希望对你有一定的参考价值。线 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • Linux 中使用 clone 函数来创建线程
    2019独角兽企业重金招聘Python工程师标准Linux上创建线程一般使用的是pthread库实际上libc也给我们提供了创建线程的函数那就是cloneintclone(i ... [详细]
  • 作者一直强调的一个概念叫做oneloopperthread,撇开多线程不谈,本篇博文将学习,怎么将传统的IO复用pollepoll封装到C++类中。1.IO复用复习使用p ... [详细]
  • C语言编程gcc怎么生成静态库.a和动态库.so
    这篇文章将为大家详细讲解有关C语言编程gcc怎么生成静态库.a和动态库.so,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章 ... [详细]
author-avatar
LeonaL_1巛980
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有