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介绍 的相关文章

  • pwrite 和 pread 相对于 fwrite 和 fread 有何优点?

    有什么优点pwrite and pread over fwrite and fread 有两部分 之间的区别pread pwrite and read write 它们都处于同一级别 即系统调用 有两个区别 p 变体采用偏移量进行读取 因此
  • 有没有办法自动关闭 fork() 上的某些句柄?

    背景 我有一个大型的现有进程 它恰好在 AIX 上 所以基本上是 POSIX 语义 它是一个更大系统的一部分 现有流程设计为连续运行 此过程的一个新要求是处理一种新型的复杂输入流 为了降低风险 我决定分叉 执行一个子进程来执行实际的输入处理
  • 共享内存和文件的关系

    忽略一些细节 Linux 中有两个可用的低级 SHM API 我们有older e g System V IPC 与 POSIX IPC https stackoverflow com questions 4582968 system v
  • 这里使用的正则表达式是否符合 POSIX 标准,并且使用的代码是否适合所描述的问题?

    根据我之前的问题here https stackoverflow com questions 76900817 check whether string contains emoji in posix if statement 请参阅下面我
  • 确定函数是否是异步信号安全的(可以在信号处理程序内部调用)

    我的问题是 如果您无权访问函数的实现 是否有办法最终确定函数是否是异步信号安全的 如果没有 有没有办法测试函数是否足够异步信号安全 可以从信号处理程序调用 如果您阅读 signal 或 sigaction 的手册页 您将获得异步信号安全函数
  • IPv4 到十进制不同的值?

    为什么 inet pton 和 inet addr 1734763876 的 IPv4 十进制值与使用这 2 个网站 1684366951 得到的值不同 struct sockaddr in sin inet pton AF INET 10
  • GNU Awk 4.2 中 FS = " " 的行为是什么?

    The first week of October Arnold Robbins announced Beta release of gawk 4 2 0 now available in the GNU announce bug gawk
  • 测试 POSIX shell 合规性?

    如何测试 shell 脚本以验证它是否符合 POSIX 标准 我有大量为各种版本的 Bash 和可能的其他 shell 编写的脚本 我希望能够确定哪些完全符合 POSIX 标准 哪些不符合 理想情况下 我想找到类似的东西lint但对于 sh
  • 为什么子进程在unix中返回退出状态= 32512?

    在我的程序中 我正在执行给定的命令并获取结果 日志和退出状态 另外 我的程序必须支持 shell 特定命令 即包含 shell 特定字符 tild pipe 的命令 但当我尝试跑步时sh c ls wc通过我的程序在我的主目录中失败 其退出
  • 信号执行期间的 sigprocmask

    我目前正在研究使用sigprocmask阻止某些信号 在这种情况下 SIGALRM and SIGCHLD 当关键代码段正在执行时 与这些信号关联的两个信号处理程序都将访问和修改中央数据结构 因此在主进程处理该数据结构时阻止它们访问它至关重
  • getchar() 返回错误的特殊情况是什么?

    所以我知道getchar 当输入结束或发生错误时返回 EOF 我也知道我可以通过以下方式检查发生了哪些情况ferror stdin and feof stdin 我想知道什么情况下会特别发生错误 我检查了这两个函数的手册页 但那里没有任何内
  • POSIX 标准对 atexit() 处理程序中的线程堆栈有何规定?操作系统的做法是什么?

    当我们的 UNIX C 程序需要紧急退出时 我们使用 exit 3 函数并安装 atexit 3 处理程序来进行紧急清理 这种方法工作得很好 直到我们的应用程序被线程化 此时 atexit 处理程序停止正常工作 我们通过试验了解到一个错误
  • 我可以获得`FILE*`的访问模式吗?

    我必须复制一个FILE Mac OS X 上的 C 语言 使用 POSIXint不幸的是 文件描述符一直是不可能的 所以我想出了以下函数 static FILE fdup FILE fp const char mode int fd fil
  • 将标准输出重定向到文件

    我正在尝试执行相当于 bash 命令的操作ls gt foo txt in C 下面的代码将输出重定向到变量 include
  • 为什么create系统调用叫creat? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何测试文件是否被锁定和/或只读而不打开?

    是否有可移植的 std filesystem 方法来测试文件是否 锁定 或具有 只读 权限 例如 MacOS Finder 具有 锁定 设置 这与标准 POSIX 权限 不同 在尝试执行删除操作之前 我需要测试是否可以删除文件 理想情况下
  • 将年月(“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 我想
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者

随机推荐

  • 高精度六轴平台(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类