Появление протокола swoole 4 переводит PHP из последовательного режима в параллельный. Существует много PHP C/C++
Расширение не учитывает параллелизм во время разработки Повторная Проблема, приводящая к сбою в Swool/|, используемой в сотрудничестве. В этой статье подробно объясняется, как писать параллельный код безопасности
C/C++ .
Реентерабельный
Пример кода:
int t; void test1(int *x, int *y) { t = *x; *x = *y; //Co procedure switching may exist in fun1 function fun1(); //Error code *y = t; }
t
Является глобальной переменной илистатическими
Статическими переменными- В ассоциации
A
ВызываетсяФункция test1
с использованием глобальных переменныхдля
- При вызове в функции
fun1()
В этой функции, если есть переключатель сопроцесса, если есть другой сопроцессB
Также реализовано.тест1
Функция, затемt
Значение может быть изменено - Ассоциация
B
Когда приостановлено, вернитесь к оркестровкеA
В это время*y
, получите неправильное значение
Память стека ссылок
Это также серьезная точка риска. Ассоциация 1
Отправьте указатель своей собственной стековой памяти другому процессу 2
Ассоциация 1
При выходе память стека co освобождается. Ассоциация 2
Жизненный цикл более длительный, чем 1
, продолжайте читать и записывать эту память, что приведет к ошибке сегмента
。
Пример:
void co1() { char buf[2048]; //Here, start a new protocol. Buf is the memory on the protocol 1 stack co2(buf); //Stack memory will be released when process 1 exits } void co2(char *buf) { for(int i=0; i<2048; i++) { Coroutine::sleep(1); //BUF memory may have been released here buf[i] = 1; } }
Кодекс безопасности сотрудничества
В целях обеспечения безопасности, в Swoole4
В программировании сотрудничества:
- Не используйте
статические
Переменные и глобальные переменные, настаивайте на использовании только локальных переменных - Если необходимо получить доступ к глобальным переменным, они должны использоваться только для логики вычислений, и не должно быть
ВВОДА-вывода
илисна
Операции, вызывающей переключение координации - Не вызывайте никаких других нереентерабельных функций
- Не ссылайтесь на память в стеке