2011-08-09 4 views
3

I가 함수 내에서 변경을 함수 포인터의 대상 기능을 정의하는 프로그램에 의해 호출되는 한 (C + +를) 포인터과 같이 말했다 :함수 내에서 함수 포인터의 대상을 변경하는 데 문제가 있습니까?

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의 디버거를 통해 빠른 실행이 보여주는 프로그램보다 그 또는 이하 예상대로 작동합니다. 그러나, 더 복잡한 환경에서 이와 같은 것을 시도한 경우에 명백해질 수있는 문제가 있습니까?

답변

6

이것은 잘 정의되어 있습니다.

실제로이 기술은 상태 시스템을 구현하는 데 자주 사용됩니다.

3

아니요, 문제가 없습니다. 일단 전화를 걸면 포인터에 끈적 거리지 않습니다.

0

이것은 스레드로부터 안전하지는 않지만 단일 스레드 응용 프로그램에서는 문제가 없습니다. 스레딩이 무엇인지 모르는 경우 사용하지 않으므로 아무런 문제가 없습니다.

고급 프로그램은 각각 인 복수의 "스레드"를 사용합니다. 기본적으로은 자체 프로그램이지만 함께 작동합니다. int main()이 있고 int main1(), int main2(), int main3() 인 경우를 모두 상상해보십시오. 동시에 모두 실행되었습니다. 한 번에 네 가지 일을 할 수있는 프로그램! 그러나 한 스레드가 fooncrement을 변경하면 다른 스레드가 업데이트 된 값을보기 전에 약간의 지연이 있습니다. 그동안 문제를 일으킬 수있는 이전 값을 사용합니다.

+0

조금 더 자세히 설명해 주시겠습니까? –

관련 문제