주기적으로 업데이트하기 위해서 시간을 비교하는 다음과 같은 코드가 있다.

void UpdatePeriodically(uint32_t currentTime)
{
static uint32_t prevTime = 0;

if(currentTime - prevTime < UPDATE_PERIOD)
{
return;
}

currentTime = prevTime;
}


이 코드는 아래의 코드로 바꿔도 똑같이 동작할 것 같지만...

void UpdatePeriodically(uint32_t currentTime)
{
static uint32_t prevTime = 0;

if(currentTime < UPDATE_PERIOD + prevTime)
{
return;
}

currentTime = prevTime;
}


다음과 같은 문제가 있음.


currentTime이 UINT32_MAX에 가까워지고,

currentTime = prevTime이 실행되면,

UPDATE_PERIOD + prevTime가 거의 UINT32_MAX에 근접하게 되고

currentTime에 오버플로우가 발생해서 다시 0부터 시작하면 문제가 발생함.



ms단위로 시간을 재는 함수를 이용했다면, 약 42일간 업데이트가 안이루어짐...

이게 진짜 잘 발생하지 않는 문제이긴 한데, 한 번 발생하면 잡기가 힘들다.


첫 번째 방식을 쓰면 currentTime에서 오버플로우가 발생하여 0부터 시작하더라도

두 변수 간의 차이를 계속 비교할 수 있음 ㅋ-ㅋ


최근에 라이브러리 쓰다가 이런 코드가 있길래 정리해봤음 ㅋ-ㅋ

추가로 찾아보고 싶으면 rollover를 키워드로 검색해보셈