线程安全与可重入

来源:互联网 发布:windows最多分区多少 编辑:程序博客网 时间:2024/05/14 06:02

首先可以参考维基百科中关于线程安全和可重入的解释来思考问题,两个是不同的概念,摘录维基百科的一段解释:

可重入与线程安全两个概念都关系到函数处理资源的方式。但是,他们有一定的区别。可重入概念会影响函数的外部接口,而线程安全只关心函数的实现。

  • 大多数情况下,要将不可重入函数改为可重入的,需要修改函数接口,使得所有的数据都通过函数的调用者提供。
  • 要将非线程安全的函数改为线程安全的,则只需要修改函数的实现部分。一般通过加入同步机制以保护共享的资源,使之不会被几个线程同时访问。

线程安全与可重入性是两个不同性质的概念。可重入是在单线程操作系统背景下,重入的函数或者子程序,按照后进先出的线性序依次执行完毕。多线程执行的函数或子程序,各个线程的执行时机是由操作系统调度,不可预期的,但是该函数的每个执行线程都会不时的获得CPU的时间片,不断向前推进执行进度。可重入函数未必是线程安全的;线程安全函数未必是可重入的。例如,一个函数打开某个文件并读入数据。这个函数是可重入的,因为它的多个实例同时执行不会造成冲突;但它不是线程安全的,因为在它读入文件时可能有别的线程正在修改该文件,为了线程安全必须对文件加“同步锁”。另一个例子,函数在它的函数体内部访问共享资源使用了加锁、解锁操作,所以它是线程安全的,但是却不可重入。因为若该函数一个实例运行到已经执行加锁但未执行解锁时被停下来,系统又启动该函数的另外一个实例,则新的实例在加锁处将转入等待。如果该函数是一个中断处理服务,在中断处理时又发生新的中断将导致资源死锁。

      在C++中,有堆线程线程安全这么定义

      对于C++中的对象来说,一个线程安全的class应当满足以下三个条件:

1、多个线程同时访问时,其表现出正确的行为。

2、无论操作系统如何调度这些线程,无论这些线程的执行顺序如何交织。

3、调用端代码无需额外的同步或者其他协调动作。

   按照这个定义,C++标准库的大多数class都不是线程安全的,包括std::string vector map等,因为这些类都需要加锁才能供多个线程同时访问。

就是按照平时,线程安全也是很难达到的目标!

2 0
原创粉丝点击