Вопрос

У меня есть код, который "звучит" примерно так:

поток 1

now = rdtsc();
for_each_member_in_a_list {
   if ( member_in_list.deadline() <= now ) {
      do_something;
   }
}

поток 2

now = rdtsc();
for_each_member_in_a_list {
   member_in_list.updatedealine( foo(now, ...) );
}

теперь, хотя в прошлом это работало хорошо, теперь с системой SMP этот код работает не так, как предполагалось.Я думаю, что буду использовать clock_gettime с CLOCK_MONOTONIC, но сначала я хотел бы услышать некоторые другие подсказки.

Это было полезно?

Решение

Теоретически TSC должен быть синхронизирован между всеми процессорами материнской платы, но в некоторых SMP-системах это не так, вините производителя материнской платы.Кроме того, на некоторых старых чипах TSC, похоже, меняется в зависимости от состояния питания процессора, что делает его потенциально очень ненадежным.clock_gettime (CLOCK_MONOTONIC) более надежен, но имеет больше накладных расходов (это системный вызов), но на сегодняшний день это лучший способ сделать это.

Я также предполагаю, что вы блокируете свои структуры данных :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top