Появление протокола 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 В программировании сотрудничества:
- Не используйте
статическиеПеременные и глобальные переменные, настаивайте на использовании только локальных переменных - Если необходимо получить доступ к глобальным переменным, они должны использоваться только для логики вычислений, и не должно быть
ВВОДА-выводаилиснаОперации, вызывающей переключение координации - Не вызывайте никаких других нереентерабельных функций
- Не ссылайтесь на память в стеке