前言:为什么写这篇博客?
原因:为什么malloc本身是线程安全函数(man手册也说明了),但是signal中使用却会产生错误与陷阱,线程是调用malloc并执行,signal也是执行malloc,可是为什么是不安全的?
背景知识:这4个部分留给初学者自己查资料,内容太多,这里简单叙述下,这5块搞清楚就能理解了,而且对于linux学习这几部分是必不可少的,现在可能感觉用不上,等真正做项目你才会发现这些概念有多重要。
(1)内核态与用户态
(2)系统调用与C库调用
(3)可重入与不可重入
(4)内核对信号的处理方法
(5)系统调用函数内部的锁
(6)同步与异步
1、系统调用函数的线程安全与可重入性
(1)在man手册中,与系统调用有关的函数都会说明该函数是否线程安全,所以这也是我们写代码需要关注的,而线程安全与函数是否可重入有很大关系,函数可重入一定是线程安全的,线程安全不一定是可重入函数,比如maloc使用递归锁实现了线程安全,但它是不可重入函数,所以不可重入函数可以通过内核锁实现线程安全(锁是系统调用,所以工作在内核态,也叫内核锁),还有很多函数也是这样实现线程安全的。

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

被折叠的 条评论
为什么被折叠?



