>> А не могут ли потоки не вовремя засыпать?

Внутри критической секции-то? Да могут, но это ни на что не влияет. Всё равно внутрь критической секции никто не войдёт пока он не проснётся и не выйдет из неё.

Инициализация:
## Код:
```
long ticks = 0;
uint old = (uint)GetTickCount();
```

Вычисление нового значения ticks устойчивое к ошибке операционной системы:
## Код:
```
Lock();
uint t = (uint)GetTickCount();
uint dt = t - old;
if (dt < int.MaxValue)
{
  old = t;
  tiks += dt;
}
else
{
  Log.Fatal("Floating time system error.");
}
Unlock();
```

Предполагается, что этот код вызывается чаще чем один раз в две недели, так что разницы dt >= int.MaxValue в обычной ситуации быть не может.