Рубрики
Uncategorized

Руководство по разработке для C / C + + расширения программы CO (1): безопасность памяти

Автор оригинала: David Wong.

Появление протокола 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 В программировании сотрудничества:

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