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

时间:2019-05-07 05:57:13

标签: php c multithreading pthreads thread-local-storage

我开发了一些PHP扩展。此扩展必须与pthread一起使用。我遇到了一个问题,因为全局变量(在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变量。因为它可能被覆盖,我的脚本崩溃了。作为变体,我可以在函数内部定义变量,并将此变量从定义了变量的函数传递到另一个函数。但是在某些情况下,当多个函数必须访问某个变量时,我无法做到这一点。有人可以告诉我一个好的做法吗?

1 个答案:

答案 0 :(得分:2)

使全局变量thread-local可以执行以下操作:

_Thread_local int test_var; /* for C11 or higher */

对于其他版本的C,这可能会做到:

thread_local int test_var; 

或这个

__thread int test_var;