可重入程序是指 能够安全地并行执行的程序或子程序。具体来说,如果一个程序或子程序在正在运行时,可以再次进入并执行它,而不会导致数据不一致或其他未定义行为,那么这个程序或子程序就被称为可重入的。
可重入程序的关键特性包括:
不含有静态(全局)非常量数据:
可重入函数不能依赖于静态数据,因为静态数据在函数调用之间保持其值,这可能导致在函数重新进入时出现数据竞争。
不返回静态(全局)非常量数据的地址:
可重入函数不能返回指向静态数据的指针,因为这同样可能导致数据竞争。
只能处理由调用者提供的数据:
可重入函数应该只依赖于调用者传递的参数,而不是全局或静态数据。
不依赖于单实例模式资源的锁:
可重入程序不能依赖于特定于某个实例的资源锁,因为这可能导致在多线程环境下出现死锁。
不调用不可重入的函数:
可重入函数不能调用其他不可重入的函数,因为这可能导致不可预测的行为。
此外,可重入性的实现通常与锁的粒度有关。一种实现方法是为每个锁关联一个获取计数值和一个所有者线程。当计数值为0时,锁被认为是未被持有;当线程请求一个未被持有的锁时,计数值递增;当线程退出同步代码块时,计数值递减。当计数值回到0时,锁被释放。
在多任务系统中,可重入程序能够在任务执行期间被信号处理程序中断,并在问题解决后继续执行,而不会影响最终结果。
总结来说,可重入程序是一种能够在多线程或多进程环境中安全并行执行的程序,它通过避免对静态数据和资源的依赖,以及正确处理锁的获取和释放,来确保程序的正确性和一致性。