Доступ к одной и той же переменной из двух потоков (как вы делаете) требует некоторой синхронизации. Используйте мьютекс, чтобы гарантировать, что только одна нить обращается к этой переменной за раз, то есть:
update()
{
// Lock mutex
currentTime = currentTime + timeDelay;
// unlock mutex
}
// Same idea for restart()
Проблема в том, что доступ к одной и той же переменной без примитива синхронизации, такого как мьютекс, проблематичен с потоками. Скажем, update () читает currentTime, выполняет сложение, но прежде чем он сможет сохранить результат, мы переключаем потоки, restart () делает свое дело. Теперь мы переключаемся на update (), который записывает (теперь недействительный) результат добавления обратно в currentTime, перезаписывая работу restart (). Mutex предотвращает это, позволяя вам гарантировать, что операция является атомной. Google для некоторых учебных пособий - вам нужно знать много других вещей, таких как тупики.
Как именно вы создаете / блокируете мьютекс, зависит от вашей ОС / каких библиотек вы хотите использовать. Родные решения - это pthreads на * nix системах, критические разделы на Win32. (Реализации pthreads существуют для Win32) В библиотеке Boost также есть раздел потоков.