php - 如何在 PHP 扩展中为每个线程封装全局变量?
问题描述
我开发了一些 PHP 扩展。此扩展必须与 pthread 一起使用。我遇到了一个问题,因为全局变量,全局声明(在 C 代码顶部),它们可以从每个 PHP 线程中触摸。例如,我们有用 C laguage 编写的简单 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;
推荐阅读
- node.js - 在非 Windows 系统上监听用户事件时获取控制/窗口信息
- javascript - CRenderFunction 在 coreui-free-vue-admin-template 中无法正常工作
- amazon-web-services - 在 athena aws 中查询多个表
- quarkus - 如何处理错误 - SRMSG00034:发出项目的下游请求不足
- ios - 取消后如何重新连接 URLSessionWebSocketTask?
- java - 尝试从 onBindViewHolder() 中的光标访问元素时应用程序崩溃
- android-management-api - 如果我们为移动设备管理(超过 1000 台设备)实施 Android 管理 API,Google 会收费吗?如果是这样,收费多少?
- python - 由于用逗号分隔字符串中的值而导致的错误
- mongodb - MongoDB 使用另一个集合中的另一个字段更新字段
- javascript - 如何使用 React 在 Accordion 中选择多个复选框?