首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-05-27 
关于可重入函数满足下列条件的函数多数是不可重入的:  1) 函数体内使用了静态的数据结构;  2) 函数体内调

关于可重入函数
满足下列条件的函数多数是不可重入的:
  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;} 

热点排行