关于可重入函数,该如何处理

关于可重入函数
满足下列条件的函数多数是不可重入的:
  1) 函数体内使用了静态的数据结构;
  2) 函数体内调用了malloc()或者free()函数;
  3) 函数体内调用了标准I/O函数。

对于1很容易理解,2我就不懂了,3的话应该是有缓冲区,大家聊聊

------解决方案--------------------
就是即使在A函数被调用没返回之前A函数中某个功能可能直接或间接调用了A也不会扰乱A的功能。
------解决方案--------------------
探讨

引用:

2,malloc/free早就安全了,否则程序都没法写了。
3,这个一般也安全了,可以看一下printf源码,内部操作FILE* buffer的位置被被加锁了,需要编译c库时候选个什么玩意的,建议考虑安全性与输出的有序性,还是在底层API的基础上封一层带互斥锁的版本为多线程服务.

===
malloc不知道,但是printf显然不是线程安全的是不可重入的……

------解决方案--------------------
探讨
引用:

引用:

2,malloc/free早就安全了,否则程序都没法写了。
3,这个一般也安全了,可以看一下printf源码,内部操作FILE* buffer的位置被被加锁了,需要编译c库时候选个什么玩意的,建议考虑安全性与输出的有序性,还是在底层API的基础上封一层带互斥锁的版本为多线程服务.

===
malloc不知道,但是printf显然……

------解决方案--------------------
探讨
就是即使在A函数被调用没返回之前A函数中某个功能可能直接或间接调用了A也不会扰乱A的功能。

------解决方案--------------------
可重入和线程安全是两回事,OK?
------解决方案--------------------
探讨

可重入和线程安全是两回事,OK?

------解决方案--------------------
发现在研究某个问题的时候经常性发现偏题 或者 钻进死胡同;
我的理解:
可重入即某个函数在同时进入时的执行并不相互影响。
线程安全主要实现了对共享资源的访问冲突问题的解决。


为啥大家常常可重入和线程安全联系在一起呢?因为多线程执行同一个函数,很容易模拟可重入中指的函数的同时被调用执行;重入也可以只同一个线程中中发生。

举个例子:即使你对函数内资源使用了互斥锁,保证了多个线程不会同时进入,但是同一个线程互斥锁就起不到作用了。(关于这个互斥锁我测试了下)
C/C++ code

//EnterCriticalSection(&cs);并不能阻止重入
DWORD WINAPI fun(LPVOID lparam)
{
    EnterCriticalSection(&cs);
    fun(0);
    //LeaveCriticalSection(&cs);
    return 0;
}