从字面上理解,可重入就是可重复进入。在编程领域,它不仅仅意味着可以重复进入,
还要求在进入后能成功执行。这里的重复进入,是指当前进程已经处于该函数中,这时
程序会允许当前进程的某个执行流程再次进入该函数,而不会引发问题。这里的执行流程
不仅仅包括多线程,还包括信号处理,longjump等执行流程。所以,可重入函数一定是
线程安全的,而线程安全函数则不一定是可重入函数。
当函数使用锁的时候,尤其是互斥锁的时候,该函数是不可重入的,否则会造成死锁。
下面来看一个死锁的例子代码如下:
编译:
运行:
为什么会死锁呢?就是因为函数hold_mutex是不可重入的函数-----------其中使用了
pthread_mutex互斥量。当mutex_thread获得mutex时,sleep_thread就收到了信号,再次
调用就进入了hold_mutex。结果始终无法拿到mutex,信号处理函数无法返回,正常的程序
流程也无法继续,这就造成了死锁。
从字面上理解,可重入就是可重复进入。在编程领域,它不仅仅意味着可以重复进入,
还要求在进入后能成功执行。这里的重复进入,是指当前进程已经处于该函数中,这时
程序会允许当前进程的某个执行流程再次进入该函数,而不会引发问题。这里的执行流程
不仅仅包括多线程,还包括信号处理,longjump等执行流程。所以,可重入函数一定是
线程安全的,而线程安全函数则不一定是可重入函数。
当函数使用锁的时候,尤其是互斥锁的时候,该函数是不可重入的,否则会造成死锁。
下面来看一个死锁的例子代码如下:
编译:
运行:
为什么会死锁呢?就是因为函数hold_mutex是不可重入的函数-----------其中使用了
pthread_mutex互斥量。当mutex_thread获得mutex时,sleep_thread就收到了信号,再次
调用就进入了hold_mutex。结果始终无法拿到mutex,信号处理函数无法返回,正常的程序
流程也无法继续,这就造成了死锁。