malloc的线程安全与signal使用malloc的陷阱(内核态与用户态、系统调用与C库调用、可重入与不可重入)

这篇博客探讨了malloc作为线程安全函数在signal处理中的不安全性,解释了内核态与用户态、系统调用与C库调用、可重入与不可重入的概念,以及内核如何处理信号。文章强调信号处理函数应避免调用不可重入函数如malloc,因为这可能导致锁死或内存混乱。建议使用POSIX定时器和单独线程处理定时任务。
摘要由CSDN通过智能技术生成

前言:为什么写这篇博客?

原因:为什么malloc本身是线程安全函数(man手册也说明了),但是signal中使用却会产生错误与陷阱,线程是调用malloc并执行,signal也是执行malloc,可是为什么是不安全的?

背景知识:这4个部分留给初学者自己查资料,内容太多,这里简单叙述下,这5块搞清楚就能理解了,而且对于linux学习这几部分是必不可少的,现在可能感觉用不上,等真正做项目你才会发现这些概念有多重要。

(1)内核态与用户态

(2)系统调用与C库调用

(3)可重入与不可重入

(4)内核对信号的处理方法

(5)系统调用函数内部的锁

(6)同步与异步

1、系统调用函数的线程安全与可重入性

(1)在man手册中,与系统调用有关的函数都会说明该函数是否线程安全,所以这也是我们写代码需要关注的,而线程安全与函数是否可重入有很大关系,函数可重入一定是线程安全的,线程安全不一定是可重入函数,比如maloc使用递归锁实现了线程安全,但它是不可重入函数,所以不可重入函数可以通过内核锁实现线程安全(锁是系统调用,所以工作在内核态,也叫内核锁),还有很多函数也是这样实现线程安全的。

2、内核处理信号内函数机制与线程处理函数机制的区别

2.1 信号

信号详细介绍该博客

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值