热门标签 | 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上一般接收到信号便结束),而不是遇到取消点才能被取消。



推荐阅读
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
  • python 对象锁_Python学习之进程和线程
    Python学习之进程和线程Python学习目录在Mac下使用Python3Python学习之数据类型Python学习之函数Python学习之高级特性Python学习之函数式编程P ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 在Linux系统中,为了提高安全性,可以通过设置命令执行超时和用户超时注销来防止因用户长时间未操作而带来的安全隐患。具体而言,可以通过编辑 `/etc/profile` 文件,添加或修改相关参数,确保用户在指定时间内无操作后自动注销。此外,还可以利用 `timeout` 命令来限制特定命令的执行时间,进一步增强系统的稳定性和安全性。 ... [详细]
  • 【并发编程】全面解析 Java 内存模型,一篇文章带你彻底掌握
    本文深入解析了 Java 内存模型(JMM),从基础概念到高级特性进行全面讲解,帮助读者彻底掌握 JMM 的核心原理和应用技巧。通过详细分析内存可见性、原子性和有序性等问题,结合实际代码示例,使开发者能够更好地理解和优化多线程并发程序。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 欢迎来到Netgen新时代:探索网络生成技术的无限可能
    欢迎进入Netgen的新时代:探索网络生成技术的无限潜力。本文将详细介绍如何编译下载的Netgen源代码,生成Netgen程序,并提供开发所需的库nglib。此外,还将探讨Netgen在现代网络设计与仿真中的应用前景,以及其在提高网络性能和可靠性方面的关键作用。 ... [详细]
  • 在操作系统中,阻塞状态与挂起状态有着显著的区别。阻塞状态通常是指进程因等待某一事件(如I/O操作完成)而暂时停止执行,而挂起状态则是指进程被系统暂时移出内存,以释放资源或降低系统负载。此外,本文还深入分析了`sleep()`函数的实现机制,探讨了其在不同操作系统中的具体实现方式及其对进程调度的影响。通过这些分析,读者可以更好地理解操作系统如何管理进程的不同状态以及`sleep()`函数在其中的作用。 ... [详细]
  • 在整理旧文件时,发现了几篇关于2011年MiniGUI技术的博客,虽然内容已显陈旧,但仍然具有一定的参考价值。这些文章详细探讨了MiniGUI的帧缓冲技术、图形渲染引擎以及输入处理机制,为理解早期嵌入式系统的图形界面开发提供了宝贵资料。 ... [详细]
  • 综合实训 201521440015
    Chinesepeople’publicsecurityuniversity网络对抗技术实验报告实验五综合渗透学生姓名常泽远年级15区队4指导教师高见信息技术与网络安全学院2018 ... [详细]
  • 以下是实验程序的源代码:***********************pthread.c***************************#include#inc ... [详细]
  • Linux多线程(2)
    线程的知识点太多,太重要,所以分成三部分进行总结学习线程安全多个线程并发同一段代码时,不会出现不同的结果。常见对全局变量或者静态变量进行操作,并且没有锁保护的情况下,会出现该问题。 ... [详细]
  • 标签PostgreSQL,Linux,perf,性能诊断,stap,systemtap,strace,dtrace,dwarf,profiler,perf_events,probe ... [详细]
  • 本文深入探讨了IO复用技术的原理与实现,重点分析了其在解决C10K问题中的关键作用。IO复用技术允许单个进程同时管理多个IO对象,如文件、套接字和管道等,通过系统调用如`select`、`poll`和`epoll`,高效地处理大量并发连接。文章详细介绍了这些技术的工作机制,并结合实际案例,展示了它们在高并发场景下的应用效果。 ... [详细]
  • 本指南详细介绍了如何使用 `apt-get` 命令在 Ubuntu 系统上部署 MySQL 5、Apache 2、PHP 5 及 phpMyAdmin。首先,建议读者查阅 Ubuntu 的官方文档以获取更多背景信息。通过本文,您将逐步了解每个软件包的安装过程及其配置方法,确保系统环境的稳定性和安全性。此外,还将提供一些常见问题的解决方案,帮助用户顺利完成部署。 ... [详细]
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社区 版权所有