旗下导航:搜·么
当前位置:网站首页 > PHP问题 > 正文

php文件锁死锁怎么办【php题目】

作者:搜搜PHP网发布时间:2019-11-26分类:PHP问题浏览:96


导读:什么是死锁学过操作体系的通同砚,都相识多线程的观点。在多线程中接见公共资本,需要对资本加锁。接见完毕后,开释锁。假如没有开释锁,那末下一个线程来猎取资本的时刻就会永久都没法...

什么是死锁

学过操作体系的通同砚,都相识多线程的观点。在多线程中接见公共资本,需要对资本加锁。接见完毕后,开释锁。假如没有开释锁,那末下一个线程来猎取资本的时刻就会永久都没法猎取资本的锁,因而这个线程死锁了。那末CGI是多线程的公共资本接见致使的死锁吗? 答案是NO。

1. CGI 是单线程历程,经由过程ps 就能够看到。(历程状况 Sl的才是多线程历程)。

2. 即使是多线程的,死锁发生在PHP的shutdown过程当中挪用glibc 中time 函数的位置,不是php模块形成的。而glibc 中的time相干函数是线程平安的,不会发生死锁。

什么致使的死锁呢?

经由过程剖析linux中死锁发生的机制,发明除了多线程会发生死锁外,信号处置惩罚函数同样会发生死锁。那末cgi是因为信号处置惩罚致使的死锁吗?在这之前引见一个感念。

函数的可重入性与信号平安

函数可重入是指,不管第几次进入该函数,函数都能一般实行并返回效果。那末线程平安函数是可重入的吗?答案是NO。 线程平安函数,在第一次接见公共资本时,会猎取全局锁。假如函数没有实行完成,锁还没开释,此时历程被中断。那末在中断处置惩罚函数中,再次接见该函数,就会发生死锁。

那末什么样的函数才能够在中断处置惩罚函数中接见呢?

除了没有运用全局锁的函数,另有一些signal safe的体系挪用能够运用。挪用任何其他的非signal safe的函数都邑发生不可预知的效果(比方 死锁)。详见 man signal。在剖析死锁的缘由前,我们先看看cgi实行的流程,剖析个中有无发生死锁的能够。

PHP-CGI的实行流程

Glibc中的时候函数运用到了全局锁,保证函数的线程平安,但没有保证信号平安(signal safe)。经由之前的剖析,我们开端疑心死锁是因为PHP-CGI历程吸收到了一个信号,然后在signal handle中实行了非signal safe的函数。主流程在中断前,正在实行glibc中的时候函数。在函数猎取的锁没开释前,进入中断流程。而中断过程当中又接见了glibc中的时候函数。因而致使了死锁。

PHP-CGI的实行流程,如下图所示:

解决办法:

去掉或简化qalarm注册到shutdown中的钩子函数。防止不平安的函数挪用。

以上内容仅供参考!

引荐教程:PHP视频教程

以上就是php文件锁死锁怎么办的细致内容,更多请关注ki4网别的相干文章!

标签:php文件锁死锁