一个 pthread_cancel 引起的线程死锁

STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记 很多单片机不带SDIO接口,所以在使用SD卡时必须使用SPI模式进行读写。 想做一个基于SPI的SD卡文件系统读写SD卡上的文件,再配合USB接口做一个模拟U盘。只能利用业余时间慢慢更新,也不知道能不能坚持下去。 我会把从零开始开发一个程序需要经历的过程一一的记录下来。做成一个奶妈级的单片机开发笔记。 一、硬件简介 1.SD卡和MicroSD卡(TF卡)的区别 由下图可以很容易的看出TF卡只是比SD卡少了一个3脚Vss脚,其它的管脚顺序 阅读详情

  这篇文章主要从一个 Linux 下一个 pthread_cancel 函数引起的多线程死锁小例子出发来说明 Linux 系统对 POSIX 线程取消点的实现方式,以及如何避免因此产生的线程死锁。

1.一个 pthread_cancel 引起的线程死锁小例子

  下面是一段在Linux 平台下能引起线程死锁的小例子。这个实例程序仅仅是使用了条件变量和互斥量进行一个简单的线程同步,thread0 首先启动,锁住互斥量 mutex,然后调用 pthread_cond_wait,它将线程 tid[0] 放在等待条件的线程列表上后,对 mutex 解锁。thread1 启动后等待 10 秒钟,此时 pthread_cond_wait 应该已经将 mutex 解锁,这时 tid[1] 线程锁住 mutex,然后广播信号唤醒 cond 等待条件的所有等待线程,之后解锁 mutex。当 mutex 解锁后,tid[0] 线程的pthread_cond_wait 函数重新锁住 mutex 并返回,最后 tid[0] 再对 mutex 进行解锁。

#include <pthread.h>
#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void* thread0(void* arg)
{
    pthread_mutex_lock(&mutex);
    printf("in thread 0 tag 1\n");
    pthread_cond_wait(&cond, &mutex);
    printf("in thread 0 tag 2\n");
    pthread_mutex_unlock(&mutex);
    printf("in thread 0 tag 3\n");
    pthread_exit(NULL);
}

void* thread1(void* arg)
{
    sleep(10);
    printf("in thread 1 tag 1\n");
    pthread_mutex_lock(&mutex);
    printf("in thread 1 tag 2\n");
    pthread_cond_broadcast(&cond);
    pthread_mutex_unlock(&mutex);
    printf("in thread 1 tag 3\n");
    pthread_exit(NULL);
}
int main()
{
    pthread_t tid[2];
    if (pthread_create(&tid[0], NULL, thread0, NULL) != 0) 
    {
        exit(1);
    }
    if (pthread_create(&tid[1], NULL, thread1, NULL) != 0) 
    {
        exit(1);
    }
    sleep(5);
    printf("in main thread tag 1\n");
    pthread_cancel(tid[0]);

    pthread_join(tid[0], NULL);
    pthread_join(tid[1], NULL);

    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);
    return 0;
}

示例代码_对上述程序的跟踪,注意执行的顺序。

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400aa8 in main at cancel.c:34
2       breakpoint     keep y   0x0000000000400ad1 in main at cancel.c:38
3       breakpoint     keep y   0x0000000000400a0d in thread0 at cancel.c:13
4       breakpoint     keep y   0x0000000000400b12 in main at cancel.c:44
5       breakpoint     keep y   0x0000000000400b1e in main at cancel.c:46
6       breakpoint     keep y   0x0000000000400a64 in thread1 at cancel.c:24
7       breakpoint     keep y   0x0000000000400b2f in main at cancel.c:47
(gdb) r
Starting program: /home/xsc/work/misec/cancel 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main () at cancel.c:34
34      if (pthread_create(&tid[0], NULL, thread0, NULL) != 0) 
(gdb) 
(gdb) bt
#0  main () at cancel.c:34
(gdb) n
[New Thread 0x7ffff77f6700 (LWP 3394)]
in thread 0 tag 1
[Switching to Thread 0x7ffff77f6700 (LWP 3394)]

Breakpoint 3, thread0 (arg=0x0) at cancel.c:13
13      pthread_cond_wait(&cond, &mutex);
(gdb) n
[Switching to Thread 0x7ffff7fdd740 (LWP 3390)]

Breakpoint 2, main () at cancel.c:38
38      if (pthread_create(&tid[1], NULL, thread1, NULL) != 0) 
(gdb) n
[New Thread 0x7ffff6ff5700 (LWP 3395)]
42      sleep(5);
(gdb) n
in thread 1 tag 1
[Switching to Thread 0x7ffff6ff5700 (LWP 3395)]

Breakpoint 6, thread1 (arg=0x0) at cancel.c:24
24      pthread_mutex_lock(&mutex);
(gdb) n
25      printf("in thread 1 tag 2\n");
(gdb) n
in main thread tag 1
in thread 1 tag 2
26      pthread_cond_broadcast(&cond);
(gdb) n
[Switching to Thread 0x7ffff7fdd740 (LWP 3390)]

Breakpoint 4, main () at cancel.c:44
44      pthread_cancel(tid[0]);
(gdb) n
in thread 1 tag 3
in thread 0 tag 2
in thread 0 tag 3

Breakpoint 5, main () at cancel.c:46
46      pthread_join(tid[0], NULL);
(gdb) n
[Thread 0x7ffff6ff5700 (LWP 3395) exited]
[Thread 0x7ffff77f6700 (LWP 3394) exited]

Breakpoint 7, main () at cancel.c:47

我们发现:

Breakpoint 7, main () at cancel.c:47
^C

   一直卡在这里。看起来似乎没有什么问题,但是 main 函数调用了一个pthread_cancel 来取消 tid[0] 线程。上面程序编译后运行时会发生无法终止情况,看起来像是pthread_cancel将 tid[0] 取消时没有执行pthread_mutex_unlock 函数,这样 mutex 就被永远锁住,线程 tid[1] 也陷入无休止的等待中。事实是这样吗?

2.取消点(Cancellation Point)

  要注意的是 pthread_cancel 调用并不等待线程终止,它只提出请求。线程在取消请求pthread_cancel发出后会继续运行,直到到达某个取消点(Cancellation Point)。取消点是线程检查是否被取消并按照请求进行动作的一个位置。pthread_cancel manual 说以下几个 POSIX 线程函数是取消点:

pthread_join(3)
pthread_cond_wait(3)
pthread_cond_timedwait(3)
pthread_testcancel(3)
sem_wait(3)
sigwait(3)

  以及read()、write()等会引起阻塞的系统调用都是Cancelation-point,而其他pthread函数都不会引起Cancelation动作。在中间我们可以找到 pthread_cond_wait就是取消点之一。

在 APUE 12.7节里 详细介绍了POSIX.1定义的可选取消点。

  但是,令人迷惑不解的是,所有介绍 Cancellation Points 的文章都仅仅说,当线程被取消后,将继续运行到取消点并发生取消动作。但我们注意到上面例子中 pthread_cancel前面 main 函数已经 sleep 了 5 秒,那么在pthread_cancel被调用时,thread0 到底运行到 pthread_cond_wait 没有?如果 thread0 运行到了 pthread_cond_wait,那么照上面的说法,它应该继续运行到下一个取消点并发生取消动作,而后面并没有取消点,所以 thread0 应该运行到 pthread_exit 并结束,这时 mutex 就会被解锁,这样就不应该发生死锁啊。

说明:
从我的GDB中可以看出,运行到pthread_cond_wait这里后,就没有往下运行了。应该说,这是当前的取消点。

3. 取消类型(Cancellation Type)

  我们会发现,通常的说法:某某函数是 Cancellation Points,这种方法是容易令人混淆的。因为函数的执行是一个时间过程,而不是一个时间点。其实真正的 Cancellation Points 只是在这些函数中 Cancellation Type 被修改为 PHREAD_CANCEL_ASYNCHRONOUS 和修改回 PTHREAD_CANCEL_DEFERRED 中间的一段时间。
  POSIX 的取消类型有两种,一种是延迟取消(PTHREAD_CANCEL_DEFERRED),这是系统默认的取消类型,即在线程到达取消点之前,不会出现真正的取消;另外一种是异步取消(PHREAD_CANCEL_ASYNCHRONOUS),使用异步取消时,线程可以在任意时间取消。

4. Linux 的取消点实现

  下面我们看 Linux 是如何实现取消点的。(其实这个准确点儿应该说是 GNU 取消点实现,因为 pthread 库是实现在 glibc 中的。) 我们现在在 Linux 下使用的 pthread 库其实被替换成了 NPTL,被包含在 glibc 库中。
以 pthread_cond_wait 为例,glibc-2.6/nptl/pthread_cond_wait.c 中:
示例代码

/* Enable asynchronous cancellation. Required by the standard. */
cbuffer.oldtype = __pthread_enable_asynccancel ();
148 /* Wait until woken by signal or broadcast. */
lll_futex_wait (&cond->__data.__futex, futex_val);
151 /* Disable asynchronous cancellation. */
__pthread_disable_asynccancel (cbuffer.oldtype);

  我们可以看到,在线程进入等待之前,pthread_cond_wait 先将线程取消类型设置为异步取消(__pthread_enable_asynccancel),当线程被唤醒时,线程取消类型被修改回延迟取消 __pthread_disable_asynccancel 。
  这就意味着,所有在__pthread_enable_asynccancel 之前接收到的取消请求都会等待__pthread_enable_asynccancel 执行之后进行处理,所有在__pthread_disable_asynccancel之前接收到的请求都会在 __pthread_disable_asynccancel 之前被处理,所以真正的 Cancellation Point 是在这两点之间的一段时间。

也就是在__pthread_enable_asynccancel与__pthread_disable_asynccancel间处理取消请求

5. 对示例函数进入死锁的解释

  当main函数中调用 pthread_cancel前,thread0 已经进入了 pthread_cond_wait函数并将自己列入等待条件的线程列表中(lll_futex_wait)。这个可以通过 GDB 在各个函数上设置断点来验证。
  当 pthread_cancel 被调用时,tid[0] 线程仍在等待,取消请求发生在 __pthread_disable_asynccancel前,所以会被立即响应。但是 pthread_cond_wait 为线程注册了一个线程清理程序(glibc-2.6/nptl/pthread_cond_wait.c):

126 /* Before we block we enable cancellation. Therefore we have to
127 install a cancellation handler. */
128 __pthread_cleanup_push (&buffer, __condvar_cleanup, &cbuffer);

  那么这个线程 清理程序 __condvar_cleanup 干了什么事情呢?我们可以注意到在它的实现最后(glibc-2.6/nptl/pthread_cond_wait.c):

85 /* Get the mutex before returning unless asynchronous cancellation
86 is in effect. */
87 __pthread_mutex_cond_lock (cbuffer->mutex);
88}

  哦,__condvar_cleanup 在最后将 mutex (这个mutex 就是调用pthread_cond_wait 的时候传递的 mutex )重新锁上了。而这时候 thread1 还在休眠(sleep(10)),等它醒来时,mutex 将会永远被锁住,这就是为什么 thread1 陷入无休止的阻塞中。

可是为什么pthread_cond_wait要在最后上锁呢?

6. 如何避免因此产生的死锁

  由于线程清理函数 pthread_cleanup_push 使用的策略是先进后出(FILO),那么我们可以在pthread_cond_wait 函数前先注册一个线程处理函数,示例代码:

void cleanup(void *arg)
{
    pthread_mutex_unlock(&mutex);
}
void* thread0(void* arg)
{
    pthread_cleanup_push(cleanup, NULL); // thread cleanup handler
    pthread_mutex_lock(&mutex);
    pthread_cond_wait(&cond, &mutex);
    pthread_mutex_unlock(&mutex);
    pthread_cleanup_pop(0);
    pthread_exit(NULL);
}

  这样,当线程被取消时,先执行 pthread_cond_wait 中注册的线程清理函数 __condvar_cleanup,将 mutex 锁上,再执行 thread0 中注册的线程处理函数 cleanup,将mutex解锁。这样就避免了死锁的发生。

7. 结论

  多线程下的线程同步一直是一个让人很头痛的问题。POSIX 为了避免立即取消程序引起的资源占用问题而引入的 Cancellation Points 概念是一个非常好的设计,但是不合适的使用 pthread_cancel 仍然会引起线程同步的问题。了解POSIX 线程取消点在 Linux 下的实现更有助于理解它的机制和有利于更好的应用这个机制。

使用YOLOv5进行工业检测(如裂纹、划痕、破损等) 本文将详细介绍如何使用YOLOv5实现工业检测项目,以检测生产线上的缺陷产品,如裂纹、划痕、破损等。我们将分步介绍数据准备、模型训练、模型优化和部署等过程。 阅读详情

相关推荐

波分复用-Zblock仿真

Z-BLOCK是一种用于光通信模块的光学元件,其核心结构是在玻璃块一侧贴有4个特定波长滤光片,另一侧镀有反射膜和增透膜。光信号在内部呈现Z字形反射路径,实现波长分离。文章以可见光LED为例,在ZEMAX中演示了非序列模式下的建模过程,重点介绍了滤光片和膜层的参数设置方法。需要注意的是,入射角度需根据玻璃折射率、通道高度和厚度精确计算,否则可能导致光泄漏。该建模方法同样适用于光通信中的光纤激光器系统。

Zhaxibamao的博客 1746

线程取消(pthread_cancel)

基本概念 pthread_cancel调用并不等待线程终止,它只提出请求。线程在取消请求(pthread_cancel)发出后会继续运行,直到到达某个取消点(CancellationPoint)。取消点是线程检查是否被取消并按照请求进行动作的一个位置。 与线程取消相关的pthread函数 int pthread_cancel(pthread_t thread) 发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。 int pthre...

Bruce的博客 1万+

Shopee滑块验证码太刁钻?手把手教你用Python+Playwright绕过弧形验证(附影刀RPA接入代码)

本文详细介绍了如何使用Python和Playwright结合SadCaptcha第三方服务高效破解Shopee平台的弧形滑块验证码,并集成到影刀RPA工作流中。该方案开发周期短、准确率高(>90%),特别适合跨境电商自动化操作,已在实际项目中验证成功。

weixin_29284657的博客 567

Thread线程学习(3) 了解Linux线程中的pthread_cancel()函数

Thread线程学习(3) 了解Linux线程中的pthread_cancel()函数;二、使用pthread_cancel()函数的基础示例;三、使用pthread_cancel()函数取消线程的进阶示例本文深入介绍了Linux线程的pthread_cancel()函数,该函数可以用于取消一个正在执行的线程。在使用pthread_cancel()函数时,需要合理设置线程的取消状态和取消类型,并确保线程在取消前完成必要的清理工作。

qq_50635297的博客 2721

Apifox CLI + Claude Skills:将接口自动化测试融入ai

基于 Apifox CLI、Claude Code以及Claude Skills组合,实现自然语言触发接口自动化测试。

wwz_0012的博客 598

PyTorch深度学习实战(4)——常用激活函数和损失函数详解

激活函数和损失函数是深度学习模型中重要组成部分,激活函数和损失函数的选择很大程度上决定了深度神经网络的性能和精度,需要根据具体问题的特点和数据分布等因素进行选择。在本节中,将介绍深度学习中常见的激活函数和损失函数,并说明不同函数的常见应用场景。

盼小辉丶的博客 1万+

Linux线程(3)——pthread_cancel()取消一个线程

在通常情况下,进程中的多个线程会并发执行,每个线程各司其职,直到线程的任务完成之后,该线程中会调用 pthread_exit()退出,或在线程 start 函数执行 return 语句退出。有时候,在程序设计需求当中,需要向一个线程发送一个请求,要求它立刻退出,我们把这种操作称为取消线程,也就是向指定的线程发送一个请求,要求其立刻终止、退出。譬如,一组线程正在执行一个运算, 一旦某个线程检测到错误发生,需要其它线程退出,取消线程这项功能就派上用场了。下面就来讨论 Linux 系统下的线程取消机制。

cj_lsk的博客 6810

【2025华为OD机考真题】- 简易内存池(B卷-200分)(C版)

🔔本文收录于「最新最全华为OD机试真题(C版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅

**My Coding Family** 961

Linux 线程控制 —— 线程取消 pthread_cancel

Linux 线程控制 —— 线程取消 pthread_cancel

challenglistic的博客 2916

基于LSTM的股票价格预测系统,Django框架,Web的股票预测系统,训练+数据集+源码(无需安装环境版)

股票价格预测是投资领域的一个重点关注课题。由于股票价格受到诸多非线性因素的影响,得到精确的预测结果较为困难。使用 PyCharm 作为代码开发工具,通过下载好的股票金融数据,进行数据预处理,构建 LSTM 网络模型,训练模型并训练出最优模型,输出股票未来收盘价波动的走势,最后在训练好的模型上,设计股票模型应用系统,运行效率较高,对股票预测具有一定的积极意义。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 955

mediasoup源码分析(二十)服务端架构设计

目录 简介 信令服务(房间服务) 调度服务 媒体服务 简介 流媒体服务器大的方向上可以分为上述三个模块。目前行业内都是分布式服务,独立部署。mediasoup信令与媒体之间虽然可以管道通信。但在行业内,服务之间通过管道通信用的少。 一般是rpc、mq,或者传统的tcp。这块licode架构比较不错,licode是信令和媒体服务通过MQ消息队列解耦。 下面介绍一下这三个服务主要功能,当然文中所说也是一家之言。 信令服务(房间服务) 信令服务也称为房间服务。有的企业把信令和房间分开,信..

lcalqf的专栏 1545

【Linux C | 多线程编程】线程的退出(return、pthread_exit、pthread_cancel函数详解)

本文介绍了`线程会终止,进程不会终止` 的三种方式。然后介绍线程退出的两个函数,最后介绍线程退出返回值。

wkd_007的博客 2686

R语言coxph函数对加权数据集进行竞争风险模型拟合、regplot包的regplot函数可视化竞争风险回归模型的列线图nomogram、计算特定病例的事件概率(控制了竞争风险的累计事件概率)

R语言coxph函数对加权数据集进行竞争风险模型拟合、regplot包的regplot函数可视化竞争风险回归模型的列线图nomogram、计算特定病例的事件概率(控制了竞争风险的累计事件概率)

statistics+insight+vista+power 358

一个 pthread_cancel 引起的线程死锁【整理转载】

说明:本文由【2,3】整理而得。 这篇文章主要从一个 Linux 下一个 pthread_cancel 函数引起的多线程死锁小例子出发来说明 Linux 系统对 POSIX 线程取消点的实现方式,以及如何避免因此产生的线程死锁。 目 录: 1. 一个 pthread_cancel 引起的线程死锁小例子 2. 取消点(Cancellation Point) 3. 取

崔行兵的专栏 1025

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

6、一个 pthread_cancel 引起的线程死锁【整理转载】

说明:本文由【2,3】整理而得。 这篇文章主要从一个 Linux 下一个pthread_cancel 函数引起的多线程死锁小例子出发来说明Linux 系统对 POSIX线程取消点的实现方式,以及如何避免因此产生的线程死锁。 目 录: 1. 一个 pthread_cancel 引起的线程死锁小例子 2. 取消点(Cancellation Point) 3. 取消类型(Cancell

ruglcc's blog 995

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

6、一个 pthread_cancel 引起的线程死锁(转)

6、一个 pthread_cancel 引起的线程死锁【整理转载】   说明:本文由【2,3】整理而得。 这篇文章主要从一个 Linux 下一个 pthread_cancel 函数引起的多线程死锁小例子出发来说明 Linux 系统对 POSIX 线程取消点的实现方式,以及如何避免因此产生的线程死锁。 目 录: 1. 一个 pthread_cancel 引起的线程死锁小例子 ...

weixin_34082177的博客 107

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

pthread_cancel的带来的一个死锁问题(验证)

代码来自:http://blog.youkuaiyun.com/wwyyxx26/article/details/9018473 如下:test_deadlock.c#include <unistd.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIA

秋歌 1355

Linux运行phread,linux多线程之pthread_cancel结束线程

摘要:这篇文章主要从一个 Linux 下一个 pthread_cancel 函数引起的多线程死锁小例子出发来说明 Linux 系统对 POSIX 线程取消点的实现方式,以及如何避免因此产生的线程死锁。目录:1. 一个 pthread_cancel 引起的线程死锁小例子2. 取消点(Cancellation Point)3. 取消类型(Cancellation Type)4. Linux 的取消点实...

weixin_30305029的博客 402

pthread_cancel引起线程死锁-linux

说明:本文由【2,3】整理而得。 这篇文章主要从一个 Linux 下一个 pthread_cancel 函数引起的多线程死锁小例子出发来说明 Linux 系统对 POSIX 线程取消点的实现方式,以及如何避免因此产生的线程死锁。 目 录: 1. 一个 pthread_cancel 引起的线程死锁小例子 2. 取消点(Cancellation Point) 3. 取消类型(Cancella

《我是你的正能量》 2114

pthread_cancel引起的死锁

 说明:本文由【2,3】整理而得。 这篇文章主要从一个 Linux 下一个 pthread_cancel 函数引起的多线程死锁小例子出发来说明 Linux 系统对 POSIX 线程取消点的实现方式,以及如何避免因此产生的线程死锁。 目 录: 1. 一个 pthread_cancel 引起的线程死锁小例子 2. 取消点(Cancellation Point) 3.

HeHui的专栏 1263

linux多线程之pthread_cancel结束线程(防止死锁)

linux多线程之pthread_cancel结束线程 摘要: 这篇文章主要从一个 Linux 下一个 pthread_cancel 函数引起的多线程死锁小例子出发来说明 Linux 系统对 POSIX 线程取消点的实现方式,以及如何避免因此产生的线程死锁。 目录: 1. 一个 pthread_cancel 引起的线程死锁小例子 2. 取消点(Cancellation Point) 3...

aircoder的博客 350

防止死锁:采用linux多线程的pthread_cancel终止线程

摘要:这篇文章主要从一个 Linux 下一个 pthread_cancel 函数引起的多线程死锁小例子出发来说明 Linux 系统对 POSIX 线程取消点的实现方式,以及如何避免因此产生的线程死锁。目录:1. 一个 pthread_cancel 引起的线程死锁小例子2. 取消点(Cancellation Point)3. 取消类型(Cancellation Type)4. Linux...

weixin_34283445的博客 87
上一篇: 线程终止资源清理方式
下一篇: mips体系堆栈回溯分析与实现
xianjian_x
博客等级 码龄14年 231粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值