posix thread介绍

2023-05-16


posix thread是 操作系统级(OS level)的API规范,主要用来定义线程及线程间同步的相关操作,采用C语言定义。posix规范主要在unix like类系统上实现;Windows类系统采用了自己的线程API。目前很多语言都在其标准库中提供了 语言级的线程支持:如Java中的Thread,concurrenty包;python中的threading model;C++11标准中的thread库等。还有很多以第三方库方式提供的各种语言的线程实现,就不一一列举了。
线程环境要素
定义一个完整的线程环境需要一下几个方面:
执行环境 execution context
即线程的表示,生命周期的管理等。
调度 scheduling
决定线程的运行状态。
同步 synchronization
多个线程之间运行时序的控制。
本文介绍下posix thread中对上述几个方面的设计与实现。
执行环境
线程的表示
posix中用pthread_t类型表示一个线程。
生命周期管理 lifecycle
线程创建 creating:
int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);
线程终止 terminating:
void pthread_exit(void *value_ptr);
int pthread_cancel(pthread_t thread);
自然终止
当线程的入口函数(start_routine)返回时,线程自然退出。
等待线程终止
int pthread_join(pthread_t thread, void **value_ptr);
线程回收recycling
int pthread_detach(pthread_t thread);
这个函数的使用需要结合线程创建时的属性(attribute)设置。


  
调度
由操作系统内核实现(用户空间的线程实现除外),根据不同的调度策略,调度个进程的运行。posix创建线程时,可以指定优先级参数,来设定线程的调度状态。
同步
同步涉及两种情况:互斥和协同工作。
互斥mutual exclusion,race condition
用来保证多个线程对共享资源(shared resource)的操作的一致性。posix thread提供的机制:mutex和reader/writer lock
mutex:
pthread_mutex_t表示一个mutex
int pthread_mutex_init ( pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); 
int pthread_mutex_destroy ( pthread_mutex_t *mutex);   
int pthread_mutex_lock (pthread_mutex_t *mutex);   
int pthread_mutex_trylock (pthread_mutex_t *mutex);   
int pthread_mutex_unlock (pthread_mutex_t *mutex);
reader/writer lock

The read-write lock permits concurrent reads and exclusive writes to a protected resource.

目前很多OS上没有实现 reader/writer lock。r/w的实现可以结合mutext和condition自行实现。

具体可参考:

http://docs.oracle.com/cd/E19455-01/806-5257/6je9h032m/index.html

协同工作 cooperating
不同线程之间根据某个事件,来决定执行。代表的情况有: producer/consumer,3哲学家问题等。posix thread提供的机制:Condition Variables
pthread_cond_t:表示一个条件变量
pthread_cond_init( )
pthread_cond_destroy( )
pthread_cond_broadcast( )
pthread_cond_signal( )
pthread_cond_timedwait( )
pthread_cond_wait( )  
posix thread的设计简洁,完备,抽象清晰、合理,是API设计的典范。posix thread提供的机制也比较简单,使用这些机制可以构建复杂的多线程程序。深入理解这些机制本身非常重要(编写正确程序的前提),所有的线程实现中(包括语言级和系统级)的基本概念和posix thread中的也都是一致的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

posix thread介绍 的相关文章

  • Linux进程间共享内存

    我有使用多个进程的服务器 fork 有大量数据可以由一个进程创建 并且应该在其他进程之间共享 因此 我使用 shm open mmap 创建共享内存并将其映射到虚拟内存 struct SharedData const char name i
  • 人类可读、递归、排序的最大文件列表

    在 POSIX shell 中打印前 10 个最大文件列表的最佳实践是什么 必须有比我当前的解决方案更优雅的东西 DIR N 10 LIMIT 512000 find DIR type f size LIMIT k exec du sort
  • 为什么子进程在unix中返回退出状态= 32512?

    在我的程序中 我正在执行给定的命令并获取结果 日志和退出状态 另外 我的程序必须支持 shell 特定命令 即包含 shell 特定字符 tild pipe 的命令 但当我尝试跑步时sh c ls wc通过我的程序在我的主目录中失败 其退出
  • POSIX rlimit:关于 RLIMIT_DATA,我们究竟可以假设什么?

    先决条件 POSIX 1 2008 http pubs opengroup org onlinepubs 9699919799 指定 http pubs opengroup org onlinepubs 9699919799 functio
  • 为什么系统调用返回 EFAULT 而不是发送段错误?

    需要明确的是 这是一个设计问题 而不是一个实现问题 我想知道 POSIX 这样做的背后的基本原理 当给定无效内存位置时 POSIX 系统调用返回 EFAULT 而不是使用户空间程序崩溃 通过发送 sigsegv 这使得它们的行为与用户空间函
  • 信号执行期间的 sigprocmask

    我目前正在研究使用sigprocmask阻止某些信号 在这种情况下 SIGALRM and SIGCHLD 当关键代码段正在执行时 与这些信号关联的两个信号处理程序都将访问和修改中央数据结构 因此在主进程处理该数据结构时阻止它们访问它至关重
  • C 标准库和 C POSIX 库的区别

    我对 C standard lib 和 C POSIX lib 有点困惑 因为我发现 C POSIX lib 中定义的许多头文件也是 C standard lib 的一部分 所以 我假设 C standard lib 是由ANSI C组织定
  • 适用于 Windows 的 NPM 包“bin”脚本

    Cucumber js 提供了一个命令行 二进制文件 这是一个简单的 js文件包含一个shebang操作说明 usr bin env node var Cucumber require lib cucumber 二进制文件在中指定packa
  • posix_fadvise(WILLNEED) 会使 IO 变慢吗?

    在运行 Linux 内核版本 2 6 18 194 26 1 el5 的 CentOS 5 5 机器上 我注意到 posix fadvise WILLNEED 使读取 60K 文件比常规 IO 慢了近 200 看起来实际的 fadvise
  • 从命名管道读取

    我必须实现一个 打印服务器 我有 1 个客户端文件和 1 个服务器文件 include
  • 将年月(“yyyy-mm”格式)转换为日期?

    我有一个如下所示的数据集 Month count 2009 01 12 2009 02 310 2009 03 2379 2009 04 234 2009 05 14 2009 08 1 2009 09 34 2009 10 2386 我想
  • 什么是 POSIX 合规性以及它对我有何影响?

    我不断看到这个问题出现 每次我查找它时 我都无法很好地解释它是什么或它对我意味着什么 什么是 POSIX 合规性 假设我的程序仅在兼容 POSIX 的机器上运行 这对我作为程序员来说有何简化 甚至吗 POSIX http pubs open
  • 同步 I/O 是否会使线程繁忙?

    假设我正在同步 I O 套接字上执行 I O 该套接字已准备好read or write手术 这意味着调用线程不会在操作上被阻塞 无论非阻塞 SOCK NONBLOCK 套接字的阻塞性质 但以下事情我不清楚 实际转移何时发生 当套接字标记为
  • 使用 posix shell 测试字符串中的正则表达式

    如何测试字符串是否与特定字符串匹配正则表达式与基本 无 bash 或任何其他 posix shell 脚本 在 if 语句中 您可以使用expr在 POSIX shell 中计算正则表达式的命令 s Abc expr s alpha 3 e
  • 命名和未命名的 posix 信号量

    计划使用 posix 信号量来同步 2 个进程 不太确定使用哪个 命名或未命名 各自的优点和缺点是什么 我如何决定使用哪个 在哪些情况下 其中一种优于另一种 Thanks 如果两个进程不相关 您应该使用命名信号量 如果两个进程相关 即分叉
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • c 使用 lseek 以相反顺序复制文件

    我已经知道如何从一开始就将一个文件复制到另一个文件 但是我如何修改程序以按相反的顺序复制它 源文件应具有读取访问权限 目标文件应具有读写执行权限 我必须使用文件控制库 例如 FILE A File B should be ABCDEF FE
  • 使用 execv 和输入重定向的 C++ 管道命令

    尝试编写一个处理内部和外部命令的 shell 我一次可以获得内部命令和一个外部命令 我的问题是如何运行这样的命令 ls l grep lib wc l 我正在使用 fork 并通过 char 中的 execv 传递外部命令 关于如何工作有什
  • 在 POSIX 中将整数值转换为 void* 并再次转换回来总是安全的吗?

    这个问题几乎与我发现的其他一些问题重复 但这特别涉及 POSIX 并且是我多次遇到的 pthreads 中一个非常常见的示例 我最关心的是当前的状况 即 C99 和 POSIX 1 2008 或更高版本 但任何有趣的历史信息当然也很有趣 问
  • 如何在线程创建和退出时调用函数?

    include

随机推荐

  • 高精度六轴平台(Hexapod platform)逆运动学分析(二)部分运动学分析

    Hexapod可以看成是由三个如下的结构组成的 xff0c 我们先提取其中一块来分析 可见Hexapod的逆运动学非常简单
  • 小白量化彩票实战(6)彩票号码中六保五缩水和旋转矩阵

    小白量化彩票实战 xff08 6 xff09 彩票号码中六保五缩水和旋转矩阵 我写彩票的博客 不是鼓励大家去买彩票 xff0c 读者要以学习编程和娱乐的思想来看待 兴趣是学习最大的动力 xff01 我编写彩票软件都有近十多年时间 xff0c
  • solidworks异型孔向导找不到标准数据库swbrowser解决方法

    1 把你找到的swbrowser文件放到安装目录下的 SOLIDWORKS Toolbox lang English中 2 打开选项 系统选项 异型孔向导 xff0c 把文件位置定位成SOLIDWORKS Toolbox 3 点击确定 举个
  • MCB MCCB ACB ELCB RCCB的区别和特性

    如有错误 xff0c 欢迎指正 先说结论 xff0c 基本可以把MCB xff0c MCCB xff0c VCB以及ACB看成过流保护断路器 xff0c 是为了保护电路电器的 xff0c 他们之间的区别一个是工作原理 xff0c 另一个就是
  • ROS学习笔记—— tf 工具包介绍

    1 准备工作 安装一些工具包 sudo apt get install ros melodic ros tutorials ros melodic geometry tutorials ros melodic rviz ros melodi
  • ROS “is neither a launch file in package”报错

    一般是没找着你的package配置文件 xff0c 运行 rospack find package 名 查看能否找到包 xff0c 找不到的话把你的包拷贝到workspace路径下 xff0c cd到你的workspace路径 然后运行 c
  • bvh-converter将bvh文件输出为csv文件失败,原因竟是numpy版本不匹配

    最近做的东西需要将bvh数据处理成xyz坐标 xff0c 在下面这篇文章找到了方法 xff1a 57条消息 人体动作捕捉格式BVH及其与三维坐标的转换 三维视频转bvh 零度蛋花粥的博客 CSDN博客 通过pip导入bvh converte
  • C++实验:多态性与虚函数

    C 43 43 实验 xff1a 多态性与虚函数 1 实验目的 xff08 1 xff09 了解多态性的概念 xff08 2 xff09 了解虚函数的作用及使用方法 xff08 3 xff09 了解静态关联和动态关联的概念和用法 xff08
  • 2014流水账

    欢迎转载 xff0c 转载请注明出处 本文地址 xff1a http blog csdn net zhenggaoxing article details 42386821 三天元旦小长假结束了 xff0c 先来回顾下三天的假期 xff1a
  • IOS中文排序学习

    前言 xff1a 最近有中文排序的需要 xff0c 发现系统没有提供中文排序的方法 xff0c 于是参考学习了网上前辈的代码实现了中文排序功能 xff0c 本文记录的就是学习实现中文排序的过程 实现英文排序 系统提供了英文排序的方法 写了一
  • IOS 定制中间突出UItabBar

    前言 xff1a 公司的项目需要定制一个中间突出的TabBar xff0c 在github 上找到一份可以参考的代码 xff08 虽然是四年前的 xff0c 但是还是很有参考价值 xff09 网址 xff1a https github co
  • Xcode删除所有断点

    问题是这样的 xff1a 接手新的项目 xff0c 顿时吓尿了 xff1a 整个程序有无数个断点 xff0c 那么如何一次性删除呢 xff1f 如下图 xff1a 点击Belete Breakpoints 就可以了
  • VSCode重新启用“错误波形提示”

    2020 06 09 更新常见问题 昨天晚上写伪码的时候 xff0c 看着VSCode的错误提示实在是心烦 xff0c 就手贱点了一下 禁用错误波形提示 xff0c 也就是disable error squiggles xff0c 但写完之
  • TortoiseSVN使用教程[多图超详细]

    安装及下载client 端 下载Windows 端程序 xff1a http tortoisesvn net downloads 一般而言 xff0c 如果是32 bit的Windows XP 应该使用TortoiseSVN 1 4 x x
  • 将UIColor转换为RGB值

    objc view plain copy 将UIColor转换为RGB值 NSMutableArray changeUIColorToRGB UIColor color NSMutableArray RGBStrValueArr 61 NS
  • 业余时间你在做什么,你就会变成什么样的人?

    改变 xff0c 从业余时间开始 博客定位 xff1a 技术 43 思考 其余统统不要 2017 xff0c 我来了 xff01
  • Xcode9 无证书真机调试

    写在前面 公司分配了新的测试机 证书99台名额已满 所以上网找教程 学习了一下如何使用Xcode无证书进行真机调试 一 创建证书 1 运行Xcode xff0c Xcode Preference 添加账号 xff08 能在appstore下
  • CSP考试复习:第一单元 C++语言基础 1.1 程序结构

    第一单元 C 43 43 语言基础 1 1 程序结构 1 程序框架 注释 xff1a 注释有两种 xff0c 一种是 xff0c 另一种是 必须单独放置一行 xff0c 或代码所在行 的后面 xff1b 而 成对存在 xff0c 可以插入到
  • Intel Realsense T265开箱测试

    前言 xff1a 最近因为要做VIO xff0c 在实验室蹭到一个Realsense T265来用 xff0c 仅此记录下简单测试过程 xff08 官方文档写非常清楚 xff0c 建议详细阅读 xff0c 链接 xff1a https gi
  • posix thread介绍

    xfeff xfeff posix thread是 操作系统级 xff08 OS level xff09 的API规范 xff0c 主要用来定义线程及线程间同步的相关操作 xff0c 采用C语言定义 posix规范主要在unix like类