Как инкапсулировать глобальную переменную в расширение PHP для каждого потока? - PullRequest
1 голос
/ 07 мая 2019

Я разрабатываю некоторые расширения PHP. Это расширение должно работать с pthreads вместе. Я столкнулся с проблемой, потому что глобальные переменные, объявленные глобально (в верхней части кода C), доступны для каждого потока PHP. Например, у нас есть простой код расширения PHP, написанный на языке C:

#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. Это означает, что мне нужно очень осторожно использовать глобальные переменные Си. Потому что это может быть перезаписано, и мой скрипт потерпел крах. Как вариант, я могу определить переменные внутри функций и передать эти переменные другим функциям из функций, в которых переменная была определена. Но я не могу сделать это в некоторых ситуациях, когда несколько функций должны иметь доступ к некоторой переменной. Кто-нибудь может рассказать мне хорошие практики для этого, пожалуйста?

1 Ответ

2 голосов
/ 07 мая 2019

Заставьте глобальную переменную thread-local делать:

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

Для других версий C это может подойти:

thread_local int test_var; 

или это

__thread int test_var; 
...