Обычно процесс может рассматриваться как стек вызовов функций / процедур / методов. В любой момент времени ваша программа будет находиться в одной точке вашего кода.
Когда мы добавляем в программу несколько потоков вместо одного стека, теперь у нас будет несколько стеков вызовов функций / процедур / методов. Каждый из них будет в любой момент времени находиться в разных точках вашего кода.
В C / C ++ ваш основной поток (тот, который все это запустил) будет иметь в нижней части стека функцию int main(int argc,char**argv)
. Это относится как к однопоточному, так и к основному потоку многопоточной программы.
Как насчет остальных тем. Ну, для каждого из них вы укажете стартовую функцию. Потоки (и основные потоки) начнут выполнение в начале функции start и будут выполняться до конца. Поток будет жив, пока выполняется его начальная функция.
Теперь думаю о вашем коде. Одной из многих возможностей является создание потока для выполнения ваших функций температуры или скорости. Это было бы вашей стартовой функцией для вновь созданного потока. Вы можете join()
из порождающей нити ждать его завершения.
Особенность потоков по сравнению с другими многопроцессорными способами организации кода (например, тяжелыми процессами) заключается в том, что, хотя мы видели, что каждый из потоков имеет свой собственный стек вызовов, они все совместно используют одну и ту же память.
Таким образом, пока невозможно изменить аргументы функции запуска потока (эта последовательность уже прошла) ... Однако другие части кода могут просто изменить какое-то значение в памяти (которая является общей) и Функция запуска потока может периодически проверять эту память , чтобы обнаружить изменение и изменить его поведение.
Но возникает другая проблема: доступ / чтение / запись в общую память, потенциально из нескольких потоков, может привести к непредсказуемым результатам. Так что (любой вид) доступ должен быть защищен какой-то синхронизацией (мьютексы, атомика ...)