POSIX 线程何时取消不是立即的?

2024-04-05

POSIX 指定了两种线程取消类型:PTHREAD_CANCEL_ASYNCHRONOUS, and PTHREAD_CANCEL_DEFERRED(通过设置pthread_setcanceltype(3)) 确定何时pthread_cancel(3)应该生效。根据我的阅读,POSIX 手册页对此没有太多说明,但 Linux 手册页说了以下内容:PTHREAD_CANCEL_ASYNCHRONOUS:

该线程可以随时取消。 (一般情况下,收到取消请求后会立即取消,但系统不保证这一点。)

我很好奇关于的含义系统不保证这一点。我可以很容易地想象这种情况发生在多核/多 CPU 系统中(在上下文切换之前)。但是单核系统呢:

  1. 当请求取消并且启用取消时,我们是否可以让线程不立即取消(pthread_setcancelstate(3)) 并取消类型设置为PTHREAD_CANCEL_ASYNCHRONOUS?
  2. 如果是,在什么条件下会发生这种情况?

我主要对 Linux (LinuxThreads / NPTL) 感到好奇,但更普遍地对查看此取消业务的 POSIX 标准兼容方式感到好奇。

更新/澄清:这里真正的实际问题是调用后立即销毁的资源的使用pthread_cancel()其中目标线程已启用取消并设置为类型PTHREAD_CANCEL_ASYNCHRONOUS!!!所以重点是:在这种情况下被取消的线程在上下文切换后是否有很小的可能性继续正常运行(即使是很短的时间)?

感谢达蒙的回答,减少了与下一个上下文切换相关的信号传递和处理的问题。

更新2:我回答了我自己的问题,指出这是一个不好的担忧,底层的程序设计应该在根本不同的概念层面上解决。我希望这个“错误”的问题对于其他想了解异步取消奥秘的人来说是有用的。


其含义正如其所言:不能保证立即发生。其原因是实施细节需要一定的“自由度”,并在标准中予以考虑。

例如在Linux/NPTL下,通过发送信号nr来实现取消。 32. 当接收到信号时,线程被取消,这通常发生在下一次内核到用户的切换时,或者在下一次中断时,或者在时间片结束时(其中may一不小心就会立刻但通常不是)。但是,当线程未运行时,永远不会收到信号。所以这里真正的问题实际上是signals不一定会立即收到。

如果你仔细想想,你甚至不可能做出有多大不同的事情。既然你可以phtread_cleanup_push操作系统必须执行的一些处理程序(它不能简单地使线程消失!),线程must必然运行被取消。无法保证any特定线程(包括您要取消的线程)在您取消线程的确切时间正在运行,因此不能保证它会立即取消。
当然,假设操作系统的实现方式是阻塞调用线程并调度要取消的线程,以便它执行其处理程序,并且仅在之后解除阻塞 pthread_cancel。但是由于pthread_cancel没有指定为阻塞,这将是一个非常令人讨厌的惊喜。由于干扰执行时间限制和调度程序公平性,这也有些不可接受。

因此,如果您的取消类型是“禁用”,那么什么也不会发生。或者,它是“enable”,并且取消类型是“deferred”,那么线程在调用被列为取消点的函数时取消pthreads(7).
或者,它是“异步”的,那么如上所述,操作系统将在它认为合适的时候做“某事”来取消线程——不是在精确的、明确定义的时间,而是“很快”。对于 Linux,通过发送信号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POSIX 线程何时取消不是立即的? 的相关文章

  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • Docker:处理 tar 文件时出错(退出状态 1):设置枢轴目录时出错:不是目录

    我是 Docker 新手 不知道是什么原因导致此错误或如何诊断它 任何有关此问题的具体帮助或有关首先检查何处以诊断此类问题的提示将不胜感激 我的 Dockerfile FROM java 8 Install maven RUN apt ge
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • 如何修复“iptables:没有该名称的链/目标/匹配”?

    我在我的 Linux 嵌入式系统上构建并安装了 iptables 如果我列出所有规则 则一切正常 iptables list Chain INPUT policy ACCEPT target prot opt source destinat
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced
  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs
  • Linux 中的无缓冲 I/O

    我正在写入大量的数据 这些数据数周内都不会再次读取 由于我的程序运行 机器上的可用内存量 显示为 空闲 或 顶部 很快下降 我的内存量应用程序使用量不会增加 其他进程使用的内存量也不会增加 这让我相信内存正在被文件系统缓存消耗 因为我不打算
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • 小部件之间的自定义信号

    尝试将信号从一个 gtk EventBox 子级发送到另一个 在 init HeadMode 第 75 行 上出现错误 类型错误 未知信号名称 消息发送 why usr bin env python coding utf8 import p
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf

随机推荐

  • WCF 中的两个接口和一个具体类

    请检查下面的示例 namespace GServices ServiceKnownType typeof SearchType ServiceContract SessionMode SessionMode Allowed public i
  • 组合两张地图

    Scala 中是否有一个函数可以组合两个映射 或者 flatMap 是一个明智的方法吗 scala gt val caps Map String Int Map A 1 B 2 caps Map String Int Map A gt 1
  • tinypng.org 如何压缩 PNG 文件? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 http tinypng org http tinypng org 是一项很棒的服务 他们将我的 png 图像优化了约 67 他们的服务如何运作 他们
  • React.js使用axios将数据发布到php,但php echo为空

    我正在使用react js axios和PHP将数据发布到MySQL数据库 这是我的react js代码 sendData var data new FormData data append name jessie data append
  • 如何开发依赖的 Composer 包而不需要提交或发布更改?

    我有一个应用程序 A 它有一个composer json 文件 定义了对包 P 的依赖关系 这是我自己的新闪亮包 我的包 P 有一个composer json 文件 它定义了对库 L 和框架 F 的依赖关系 我的包 P 还没有远程存储库 并
  • 如何在 Kubernetes 中模仿“--volumes-from”

    我正在寻找一种模式 允许在 Kubernetes 中同一 Pod 上运行的两个容器之间共享卷 我的用例是 我有一个 Ruby on Rails 应用程序在 Docker 容器内运行 docker 镜像包含静态资源 app
  • 如何使 RawPrinterHelper 同时在 XPS_PATH 和 RAW 数据类型中工作?

    我在用原始打印机助手 http support microsoft com kb 322091 en us用于打印 它可以在 Windows 7 及之前的版本上正常运行 当我们使用安装在 Windows 8 电脑上的打印机进行尝试时 它不起
  • 如何防止两个相同类型的管道 jenkins 作业在同一节点上并行运行?

    我不想允许同一类型 同一存储库 的两个作业在同一节点上并行运行 我怎样才能在 Jenkinsfile 中使用 groovy 来做到这一点 中提供的答案https stackoverflow com a 43963315 6839445 ht
  • Clojure 的 Atom 在 Scala 中相当于什么?

    Clojure 有一个原子 http clojure org atoms for 以同步且独立的方式改变线程之间的状态 http clojure org concurrent programming 这不是 STM 的一部分 https s
  • Chrome 开发者工具中资源的 status=canceled 是什么意思?

    什么会导致页面被取消 我有 Chrome 开发者工具的屏幕截图 这种情况经常发生 但并非每次都会发生 似乎一旦缓存了其他一些资源 页面刷新就会加载 LeftPane aspx 真正奇怪的是 这种情况只发生在 Google Chrome 中
  • 出现错误:write() 不接受关键字参数

    gd open gamedata py rb gd write CharHealth 100 gd close 我收到错误消息 write 不接受关键字参数 但我不明白为什么 我最好的解释是代码试图解释 CharHealth 100 作为关
  • 在 Visual Studio 中设置缩进样式?

    我有 2 个问题 Q1 我读过各种编码缩进样式 http en wikipedia org wiki Indent style如奥尔曼 K R 等 我想知道的是VS 2010 中的设置在哪里可以设置所有这些 Q2 当我按下Ctrl K an
  • 使用数组作为 CGridView 的数据源

    我希望这能起作用 我正在编写和开票应用程序 并希望将当前发票保存在一个数组中 该数组可以存放在 blob 字段中 这也将用于存档更改等 发票的销售项目使用CGridView 显示 唯一的事情是所有文档都说数据源应该是 IDataProvid
  • Android CameraX 如何实现广角/缩小

    我尝试使用以下方法为我的应用内相机实现广角选项CameraXapi 但遇到了一个问题 CameraControl setZoomRatio允许设置缩放范围ZoomState getMinZoomRatio and ZoomState get
  • Sublime Text 2 / Sublime Text 3 在 osx 上恢复未保存的文件

    在 Sublime 中 我知道即使您稍后不将更改保存在文件中 您也可以从上次停下的地方开始 我在 sublime 中打开了一个新选项卡 并在保存文件之前关闭了应用程序 sublime 是否在计算机中的某个位置保存临时文件 我使用的是 MAC
  • 存储库和工作单元模式 - 如何保存更改

    尽管此类问题被问了很多次 但我仍在努力理解存储库和工作单元模式之间的关系 本质上我仍然不明白哪一部分将保存 提交数据更改 存储库还是工作单元 由于我见过的每个示例都与将它们与数据库 或映射器结合使用有关 让我们制作一个更有趣的示例 让我们将
  • 如何为引导选项卡提供外部链接

    我在 ASP NET MVC 项目中使用引导选项卡 在此选项卡中 我需要提供外部链接 以便当用户单击特定选项卡时 它将重定向到特定链接 基本上我有四个控制器 现在 当用户单击选项卡时 我需要重定向到每个控制器 下面是我尝试使用的代码 但它不
  • 由于 SparkContext 关闭,作业被取消

    在 jupyter 笔记本中运行我的 Spark 程序时 出现错误 作业被取消 因为 SparkContext 已关闭 我在没有 hadoop 的情况下使用 Spark 同一个程序之前给出了输出 但现在显示错误 知道为什么会发生错误 我的代
  • ImagePullBackOff 与 Minikube 的本地存储库

    我正在尝试使用 minikube 和 kitematic 在本地计算机上测试 Kubernetes 但是 kubernetes 无法在我的本地存储库中提取映像 ImagePullBackOff 我试图用这个来解决它 使用 Minikube
  • POSIX 线程何时取消不是立即的?

    POSIX 指定了两种线程取消类型 PTHREAD CANCEL ASYNCHRONOUS and PTHREAD CANCEL DEFERRED 通过设置pthread setcanceltype 3 确定何时pthread cancel