Есть ли проблемы с изменением цели указателя функции изнутри функции?(C ++) - PullRequest
3 голосов
/ 10 августа 2011

У меня есть программа, которая определяет изменения целевой функции указателя функции изнутри функции, вызываемой указанным указателем, например:

void increment(int&);
void superincrement(int&);

void (*fooncrement)(int&);

int main() {
    int j = 0;
    fooncrement = increment;
    while (true == true) {
        fooncrement(j);
    }
}

void increment(int& i) {
    static int counter = 0;

    i++;

    if (counter > 7)
        fooncrement = superincrement;
    counter++;
}

void superincrement(int& i) {
    i += 23;
}

Быстрый просмотр отладчика MSVC показывает, что программа болееили меньше работает, как ожидалось.Однако есть ли здесь какие-то проблемы, которые не сразу очевидны, которые могут проявиться, если я попробую что-то подобное в более сложной среде?

Ответы [ 3 ]

6 голосов
/ 10 августа 2011

Это четко определено.

Фактически этот метод часто используется для реализации конечных автоматов.

3 голосов
/ 10 августа 2011

Нет, не должно быть никаких проблем. Не похоже, что он цепляется за указатель, как только вы сделали вызов.

0 голосов
/ 10 августа 2011

Это не поточно-ориентированный, но для однопоточных приложений проблем нет.Если вы не знаете, что такое многопоточность, то вы не используете ее, поэтому у вас нет проблем.

Более продвинутые программы используют несколько «потоков», каждая из которых в основном это собственная программа, но они работают вместе.Представьте, что у вас есть int main(), но также int main1(), int main2(), int main3(), и все они работают одновременно.Ваша программа может делать четыре вещи одновременно!Однако, если один поток изменит fooncrement, будет небольшая задержка, прежде чем другие потоки увидят обновленное значение.В то же время они будут использовать старое значение, что может вызвать проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...