第二节 PHP中的线程安全
从作用域上来说,C语言可以定义4种不同的变量:全局变量,静态全局变量,局部变量,静态局部变量。下面仅从函数作用域的角度分析一下不同的变量,假设所有变量声明不重名。- 全局变量,在函数外声明,例如,int gVar;。全局变量,所有函数共享,在任何地方出现这个变量名都是指这个变量。- 静态全局变量(static sgVar),其实也是所有函数共享,但是这个会有编译器的限制,算是编译器提供的一种功能。- 局部变量(函数/块内的int var;),不共享,函数的多次执行中涉及的这个变量都是相互独立的,他们只是重名的不同变量而已。- 局部静态变量(函数中的static int sVar;),本函数间共享,函数的每一次执行中涉及的这个变量都是这个同一个变量。
上面几种作用域都是从函数的角度来定义作用域的,可以满足所有我们对单线程编程中变量的共享情况。现在我们来分析一下多线程的情况。在多线程中,多个线程共享除函数调用栈之外的其他资源。因此上面几种作用域从定义来看就变成了。- 全局变量,所有函数共享,因此所有的线程共享,不同线程中出现的不同变量都是这同一个变量。- 静态全局变量,所有函数共享,也是所有线程共享。- 局部变量,此函数的各次执行中涉及的这个变量没有联系,因此,也是各个线程间也是不共享的。- 静态局部变量,本函数间共享,函数的每次执行涉及的这个变量都是同一个变量,因此,各个线程是共享的。
上面几种作用域都是从函数的角度来定义作用域的,可以满足所有我们对单线程编程中变量的共享情况。现在我们来分析一下多线程的情况。在多线程中,多个线程共享除函数调用栈之外的其他资源。因此上面几种作用域从定义来看就变成了。- 全局变量,所有函数共享,因此所有的线程共享,不同线程中出现的不同变量都是这同一个变量。- 静态全局变量,所有函数共享,也是所有线程共享。- 局部变量,此函数的各次执行中涉及的这个变量没有联系,因此,也是各个线程间也是不共享的。- 静态局部变量,本函数间共享,函数的每次执行涉及的这个变量都是同一个变量,因此,各个线程是共享的。