rdts для обозначения временных сроков
-
22-08-2019 - |
Вопрос
У меня есть код, который "звучит" примерно так:
поток 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) более надежен, но имеет больше накладных расходов (это системный вызов), но на сегодняшний день это лучший способ сделать это.
Я также предполагаю, что вы блокируете свои структуры данных :)