可重入与线程安全

----------可重入------------

概念:

  可重入函数,即函数(操作)中断后,再次进入该函数继续执行仍能得到正确的结果,这里强调的是中断后能正确执行。

举个例子:

  程序执行到某个函数foo()时,收到信号,于是暂停目前正在执行的函数,转到信号处理函数,而这个信号处理函数的执行过程中,又恰恰也会进入到刚刚执行 的函数foo(),这样便发生了所谓的重入。此时如果foo()能够正确的运行,而且处理完成后,之前暂停的foo()也能够正确运行,则说明它是可重入 的。这里不涉及到线程的概念,重要的是中断后可重新继续,并得到正确的结果。

---------线程安全--------

概念:

  线程安全的概念比较直观。一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。强调多线程并发调用不会发生错误。

 形式:

1)函数内部含有共享数据,但是代码段操作本身是原子操作,那么这个函数是线程安全的。比如对一个位宽内的变量进行赋值操作。

2)函数内部操作加锁互斥,通过这种方式,保证只有当一个线程执行完该段代码后,另一个线程才能来执行,保证数据不受污染。

注释:原子操作:在CPU一个时间片内可以执行完成的操作,也就是一条汇编指令可以完成的操作;

区别:

以上两个概念经常有人让人混淆不清,那么请注意两个概念的红字部分,这也就是他们的区别。

有概念提出可重入的函数一定是线程安全的,个人觉得,这种提法虽然没有错误,线程安全本身就是为了保护共享数据,可重入函数本身并不涉及共享数据的保护,且数据都有独立的栈空间,谈不谈线程安全也没有什么意义。且这种提法容易使人混淆线程安全和可重入的概念。

猜你喜欢

转载自www.cnblogs.com/wangkeqin/p/9804605.html