Существует ли состояние гонки, когда 2 процесса пытаются прочитать системные часы одновременно? - PullRequest
1 голос
/ 14 октября 2019

У меня есть 2 процесса (не потоки), которые должны считывать системные часы одновременно. Для этой цели первый процесс использует

QTime::currentTime();

и второй процесс использует

std::chrono::high_resolution_clock::now();

Но когда я читаю соответствующие значения часов, считанные этими двумя процессами, я обнаруживаю, что всегда есть разница в несколько микросекунд. Это потому, что системные часы являются общим ресурсом, поэтому нужно ждать, пока другой закончит чтение? Это потому, что функции, которые читают системные часы, не одинаковы, поэтому разрешение по времени не одинаково? (но это кажется мне маловероятным ... потому что в моем понимании разрешение по времени задается RTC, а не высокоуровневыми API)Я не использую какую-либо конкретную «меру» для синхронизации этих двух процессов. Первый постоянно пытается прочитать системные часы (у него есть время (1)), второй читает системные часы, когда я его запускаю. Таким образом, поскольку первый процесс всегда пытается прочитать системные часы, я думаю, что, вероятно, будет возникать «состояние гонки», когда процесс 2 попытается прочитать часы.

1 Ответ

0 голосов
/ 14 октября 2019

Существует только состояние гонки в том смысле, что вы не можете предсказать, какой процесс сообщит о более раннем времени или если они сообщат об этом одновременно. Никакого вреда не причиняют (почти) одновременные чтения часов. Оба отчета будут точными с точностью до способности ОС доставлять информацию. В зависимости от ОС и аппаратного обеспечения, два процесса могут или не могут иметь возможность сообщать об одном и том же времени.

Это может быть или не быть общим ресурсом. Это может быть даже не те же часы под капотом. std::chrono::high_resolution_clock обычно составляет от typedef до std::chrono::steady_clock или std::chrono::system_clock и зависит от платформы. На macOS / iOS / watchOS high_resolution_clock имеет значение от typedef до steady_clock и считает наносекунды с момента загрузки системы. Эта мера не имеет отношения к времени дня или дате в календаре.

Здесь есть описание разницы между steady_clock и system_clock .

...