RDTS, чтобы отметить сроки - PullRequest
0 голосов
/ 07 февраля 2009

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

нить 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, но я хотел бы сначала услышать некоторые другие подсказки.

1 Ответ

1 голос
/ 10 февраля 2009

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

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

...