如何在每个线程的 PHP extension 中封装全局变量?
How to encapsulate global variable in PHP extension for each thread?
我开发了一些 PHP 扩展。此扩展必须与 pthreads 一起工作。我遇到了一个问题,因为全局变量是全局声明的(在 C 代码顶部),每个 PHP 线程都可以访问它们。例如,我们有用 C 语言编写的简单 PHP 扩展代码:
#include <php.h>
int test_var;
PHP_FUNCTION(set_var) {
test_var = 123;
}
PHP_FUNCTION(print_var) {
printf("%d", test_var);
}
如果我们在第一个 PHP 线程中 运行 以下代码:
set_var();
然后 运行 第二个线程中的以下 PHP 代码:
print_var();
第二个线程的输出将是 123。这意味着我必须非常小心地使用全局 C 变量。因为它可能被覆盖并且我的脚本崩溃了。作为变体,我可以在函数内部定义变量,并将该变量从定义变量的函数传递给另一个函数。但在某些情况下,当多个函数必须访问某个变量时,我无法做到这一点。有人可以告诉我一个好的做法吗?
让全局变量thread-local做:
_Thread_local int test_var; /* for C11 or higher */
对于其他版本的 C,可能会这样:
thread_local int test_var;
或者这个
__thread int test_var;
我开发了一些 PHP 扩展。此扩展必须与 pthreads 一起工作。我遇到了一个问题,因为全局变量是全局声明的(在 C 代码顶部),每个 PHP 线程都可以访问它们。例如,我们有用 C 语言编写的简单 PHP 扩展代码:
#include <php.h>
int test_var;
PHP_FUNCTION(set_var) {
test_var = 123;
}
PHP_FUNCTION(print_var) {
printf("%d", test_var);
}
如果我们在第一个 PHP 线程中 运行 以下代码:
set_var();
然后 运行 第二个线程中的以下 PHP 代码:
print_var();
第二个线程的输出将是 123。这意味着我必须非常小心地使用全局 C 变量。因为它可能被覆盖并且我的脚本崩溃了。作为变体,我可以在函数内部定义变量,并将该变量从定义变量的函数传递给另一个函数。但在某些情况下,当多个函数必须访问某个变量时,我无法做到这一点。有人可以告诉我一个好的做法吗?
让全局变量thread-local做:
_Thread_local int test_var; /* for C11 or higher */
对于其他版本的 C,可能会这样:
thread_local int test_var;
或者这个
__thread int test_var;