244 подписчика
МЕТОДЫ ПРОГ. ИНЖЕНЕРИИ. ТЕК. ВРЕМЯ В МНОГОПОТОЧНОСТИ
..
Всем привет. Часто в логах нужно добавить текущее время перед строкой с логом в файл, например, так "13:41:12.257901", текущее время с указанием микросекунд. Для использования функции, которая будет возвращать текущее время в строке как указано выше совместно несколькими потоками обычно нужно делать разделение доступа ч\з мьютексы и т.п.
..
Предполагается что несколько потоков будут использовать одну и ту же ф-ю совместно для того чтобы подставлять текущее время в свои логи или в консоль. Но, текущее время для всех потоков и для всей системы одно и то же. Поэтому для максимального быстродействия можно переменные в ф-и сделать вообще статические. Плюс сделать такую реализацию что одна переменная устанавливается один раз и в один проход.
..
Как это работает. См. изображение схемы ниже. Есть три статические переменные, грубо говоря 3 ячейки памяти, которые видны всем потокам одновременно и каждый из них может в неё "залезть". В этой ф-и ("get_str_curr_time_ptr") каждая переменная выставляется только один раз (системной ф-ей или ч\з системный вызов), а читатся может несколько раз. Предположим что у нас около сотни потоков и эту ф-ю каждый поток выполняет на одной из 3х стадий, т.е. на одной из 3х атомарных системных функций (или выражений).
..
Несмотря на то что разделения доступа между потоками нет это не приводит к ошибке и к неверному результату. В определённый момент один из потоков обновляет одну из переменных, а поскольку каждая из них обновляется в одном месте программы, то это не приводит к ошибке, а приводит к обновлению текущего системного времени в них.
..
Зачем всё это надо если можно использовать мьютексы, например. А затем что межпоточное разделение доступа выполняется ч\з системные вызовы, а это накладно даже для потоков, а не процессов. А здесь никаких доп. инстурментов нет, даже три переменные статические, т.е. общие для всех потоков. В резльтате ф-я возвращает текущее время в строке, например, "16:30:31.773012".
..
Как это реализовано на СИ изображено справа на изображении.
..
1 минута
7 февраля 2024