关于可重入函数,该如何处理
关于可重入函数
满足下列条件的函数多数是不可重入的:
1) 函数体内使用了静态的数据结构;
2) 函数体内调用了malloc()或者free()函数;
3) 函数体内调用了标准I/O函数。
对于1很容易理解,2我就不懂了,3的话应该是有缓冲区,大家聊聊
------解决方案--------------------
就是即使在A函数被调用没返回之前A函数中某个功能可能直接或间接调用了A也不会扰乱A的功能。
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
可重入和线程安全是两回事,OK?
------解决方案--------------------
------解决方案--------------------
发现在研究某个问题的时候经常性发现偏题 或者 钻进死胡同;
我的理解:
可重入即某个函数在同时进入时的执行并不相互影响。
线程安全主要实现了对共享资源的访问冲突问题的解决。
为啥大家常常可重入和线程安全联系在一起呢?因为多线程执行同一个函数,很容易模拟可重入中指的函数的同时被调用执行;重入也可以只同一个线程中中发生。
举个例子:即使你对函数内资源使用了互斥锁,保证了多个线程不会同时进入,但是同一个线程互斥锁就起不到作用了。(关于这个互斥锁我测试了下)
满足下列条件的函数多数是不可重入的:
1) 函数体内使用了静态的数据结构;
2) 函数体内调用了malloc()或者free()函数;
3) 函数体内调用了标准I/O函数。
对于1很容易理解,2我就不懂了,3的话应该是有缓冲区,大家聊聊
------解决方案--------------------
就是即使在A函数被调用没返回之前A函数中某个功能可能直接或间接调用了A也不会扰乱A的功能。
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
可重入和线程安全是两回事,OK?
------解决方案--------------------
------解决方案--------------------
发现在研究某个问题的时候经常性发现偏题 或者 钻进死胡同;
我的理解:
可重入即某个函数在同时进入时的执行并不相互影响。
线程安全主要实现了对共享资源的访问冲突问题的解决。
为啥大家常常可重入和线程安全联系在一起呢?因为多线程执行同一个函数,很容易模拟可重入中指的函数的同时被调用执行;重入也可以只同一个线程中中发生。
举个例子:即使你对函数内资源使用了互斥锁,保证了多个线程不会同时进入,但是同一个线程互斥锁就起不到作用了。(关于这个互斥锁我测试了下)
- C/C++ code
//EnterCriticalSection(&cs);并不能阻止重入 DWORD WINAPI fun(LPVOID lparam) { EnterCriticalSection(&cs); fun(0); //LeaveCriticalSection(&cs); return 0; }