如何在PHP扩展中为每个线程封装全局变量?

如何在PHP扩展中为每个线程封装全局变量?,php,c,multithreading,pthreads,thread-local-storage,Php,C,Multithreading,Pthreads,Thread Local Storage,我开发了一些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扩展。此扩展必须与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代码:

print_var();

第二个线程的输出将是123。这意味着我必须非常小心地使用全局C变量。因为它可能被覆盖,我的脚本崩溃了。作为变量,我可以在函数中定义变量,并将这些变量从定义变量的函数传递给另一个函数。但在某些情况下,当几个函数必须访问某个变量时,我不能这样做。有谁能告诉我一个好的做法吗

使全局变量线程成为局部变量,执行以下操作:

_Thread_local int test_var; /* for C11 or higher */
对于C的其他版本,这可能会:

thread_local int test_var; 
还是这个

__thread int test_var; 

任何语言中的全局变量都可能是糟糕设计的标志,但有时它们只是使用起来很方便(可能太多了)。您最好将所需的变量作为参数传递。问题是,如果没有大量潜在的代码,除了建议如何做之外,很难为您的问题提供完整的解决方案。不过,如果使用指针,请注意它们指向的数据可能不是“线程本地”的。
__thread int test_var;