jkzyx 2020-03-26
PHP在默认的情况下是不支持多线程的,通过安装pthreads扩展,让其参数来指定编译PHP的线程安全方式来使其支持多线程,但是使用的过程中要考虑到线程安全的问题
线程是操作系统中进行运算调度的最小单位。它被包含在进程中,是进程中的实际运作单位。今天将要分享的是线程知识是有关于PHP的,具有一定的参考价值,希望对大家有所帮助
多线程的理解
所谓多线程就是在在一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程大大提高了程序的执行效率,一个多线程比单线程被操作系统调度的概率更大。而且更高效。多个线程可以在多核CPU的多个核心同时运行,加快了运行效率。而且线程间的通信更加简单。
PHP多线程
在默认情况下PHP是不支持多线程的,要使用多线程需要安装 扩展,目前常用的扩展有pcnlt,POSIX ,pthreads,但是用的最多的还是pthreads扩展,它通过使用参数来指定来编译PHP时的线程安全方式,使其支持多线程
在使用线程之前首先要考虑到线程的安全问题,线程安全指的是某个函数或函数库在多线程环境中被调用时,能够正确的处理多线程之间的共享变量,使得程序的功能能够正确完成
例:
在多线程中由于存在共享变量,很有可能会导致出现以下问题:
存在一个全局数组:$arr = array(‘a‘);
A 线程获取数组长度为1;
B 线程获取数组长度为1;
A 线程pop出数组元素 $a = array_pop($arr); $a = ‘a‘;
B 线程也pop数组元素 $b = array_pop($arr); $a = null;
但是此时B线程内就出现了错误事件,虽设置了数组长度大于0,但是没有 pop值来
PHP实现线程安全
PHP实现线程安全主要通过 TSRM 机制,通过此机制可以对全局变量和静态变量进行隔离,并且给每个线程都复制了一份全局变量和静态变量。各个线程使用的都是主线程的一个备份。这样就避免了变量冲突,也不会发生线程安全的问题。
PHP 对多线程的封装保证了线程安全,所以开发人员就不需要在考虑读写冲突的问题了,也使得代码更加安全。不过这样做也有不好的地方,例如当子线程开始运行时,主线程便再也无法对子线程运行细节进行调整了,失去了消息传递能力