1. 线程安全

1.1. 什么是线程安全

线程安全指的是多线程环境下如何安全的获取公共资源.

公共资源一般指函数之外声明的全局变量,不同线程在访问同一个全局变量, 修改全局变量时就会影响所有线程.

1.2. 怎么解决线程安全

PHP 的 SAPI 多数是单线程环境,比如 cli,fpm,cgi,每个进程只启动一个主线程,这种模式下不存在线程安全问题.

但是也有多线程的环境,比如 Apache,或用户自己嵌入 PHP 实现的环境.

PHP 中有很多全局变量: EG, CG 等

PHP 为多线程的应用模型提供了一个安全机制: Zend 线程安全(Zend Thread Safe, ZTS)

线程安全资源管理器(Thread Safe Resource Manager, TSRM): 各线程不再共享一份全局变量,而是各复制一份,使用数据时各线程各取自己的副本,互不干扰.

TSRM 核心思想就是为不同线程分配独立的内存空间, 如果一个资源会被多线程使用,那么首先需要预先向 TSRM 注册资源, 然后 TSRM 为这个资源分配一个唯一的编号, 并把这种资源的大小,初始化函数等保存到一个tsrm_resource_type结构中,各线程只能通过 TSRM 分配的编号访问这个资源.然后当线程拿着这个编号获取资源时 TSRM 如果发现是第一次请求,则会根据注册时的资源大小分配一块内存,然后调用初始化函数进行初始化,并把这块资源保存下来供这个线程后续使用.

results matching ""

    No results matching ""