【问题标题】:How to encapsulate global variable in PHP extension for each thread?如何在 PHP 扩展中为每个线程封装全局变量?
【发布时间】:2019-09-24 17:54:56
【问题描述】:

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

【问题讨论】:

  • 任何语言的全局变量都可能是设计不佳的标志,但有时它们只是使用方便(也许太多了)。将所需的变量作为参数传递会更好。问题是如果没有潜在的大量代码,除了建议如何解决之外,很难为您的问题提供完整的解决方案。

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


【解决方案1】:

使全局变量thread-local正在做:

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

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

thread_local int test_var; 

或者这个

__thread int test_var; 

【讨论】:

  • 不过,如果使用指针,请注意它们指向的数据可能不是“线程本地的”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多