可重入与线程安全

在单线程的进程中,有且仅有一个控制流,函数代码即使是不可重入的,或者线程不安全的,也没有问题。但在多线程的程序中,有可能同一段代码同事被多个控制流并发的访问。这个时候为了保证资源的完整性,要为多线程程序编写的代码必须是可重入的和线程安全的。

可重入和线程安全是两个相互独立的概念。

  • 可重入

一个可重入的函数不能为后续的调用保持静态(或全局)数据,也不能返回指向静态(或全局)数据的指针。函数中用到的所有的数据,都应该由该函数的调用者提供。一个可重入的函数不能调用不可重入的函数。

  • 线程安全

一个线程安全的函数通过“锁”来bo保护共享资源不被并发地访问。线程安全仅关心函数的实现,而不影响它的外部接口。任何一个不适用静态数据和其他共享资源的函数就是最普通的线程安全的。

  • 使一个函数变成可重入的

不可重入的函数修改成可重入的函数时,需要修改函数的对外接口。不可重入的函数不能被多线程的程序调用。

一般,很多不可重入的函数韩慧一个指向静态数据的指针。则在修改时,去掉静态数据,由调用者提供空间。

一个可重入的函数不应该为后续的调用保持数据(即后继的调用与本次调用无关)。

  • 使一个函数变成线程安全的

使用静态数据或者其他任何共享资源的函数,必须对这些资源加锁,以实现对它们的串行访问。

线程安全:解决多个线程共享资源的问题。

大多数情况下, 要将不可重入的函数改为可重入的,需要修改函数接口,使得所有数据都通过函数的调用者提供。

要将线程非安全的函数改为线程安全的,则需要修改函数的实现部分。一般通过加入同步机制以保护共享的资源,使之不会被几个线程同时访问。可重入的函数未必是线程安全的,线程安全的函数未必是可重入的。

posted on 2011-05-24 15:01  ActiveChange  阅读(1626)  评论(0编辑  收藏  举报

导航