由于cublog系统的缘故,将前段时间写的一篇blog文章再次贴上。 可重入函数这一概念早有接触,但一直未有系统的理解,最近阅读《APUE》信号一章时,其中讲解很到位,故总结如下。 信号作为一种软中断,能够被进程给捕获,因而也就中断进程的正常执行,转而去执行信号处理程序,最后再返回到原进程继续正常执行。然而,当进程正在执行malloc()动态内存分配时,信号产生从而转入到信号处理程序,但当信号处理程序中也用到了malloc()函...
by haitao-andy - Linux文档专区 - 2007-06-16 21:14:34 阅读(1436) 回复(0)
记得以前讨论过一个关于reentrant函数与thread safe函数的帖子 很多人对于这两种函数不是很了解, 尤其是发现malloc等函数是non-reentrant函数时,对多线程编程都产生了"恐惧" 这里是我对这两种函数的一些理解,希望和大家探讨一些.欢迎批评指正. 1. reentrant函数 一个函数是reentrant的,如果它可以被安全地递归或并行调用。要想成为reentrant式的函数,该函数不能含有(或使用)静态(或全局)数据(来存储函数调用过程中的状态信息),...
[Macro] _reentrant [Macro] _THREAD_SAFE If you define one of these macros, reentrant versions of several functions get declared. Some of the functions are specified in POSIX.1c but many others are only available on a few other systems or are unique to GNU libc. The problem is the delay in the s...
我记得在linux程序设计一书中说多线程编程为了保证函数的可重入性,需要在编译是定义reentrant宏,但我在工作中很少见这样做,是不是编译器已经帮我们做了可重入性的工作了??另外什么时候要加上POSIX_C_SOURCE宏?谢谢。
可重入(reentrant):函数被同时调用时,每个调用访问独立的数据。 线程安全(thread-safe ):函数被同时调用时,每个调用访问共享数据,但是访问被序列化了(通过加锁等手段)。 例如: 可重入: int get_value() { int iRet = what_you_want(); return iRet; } 线程安全: int g_value; int get_value() { return someMUTEX(g_value); }