C ++: я могу дать новое значение потоку, пока он еще работает, или мне нужно сначала его завершить? - PullRequest
0 голосов
/ 07 сентября 2018

Я только начал использовать потоки при кодировании, и я не уверен, правильно ли я понял, как они работают. Если я правильно понял, с помощью потока вы можете запустить две функции одновременно. Можно ли изменить значение, данное одной из функций, пока она еще работает параллельно? В моем случае я читаю инструкции из файла CSV, такие как:

colAction=VELOCITY;     colTime=0;      colParam1=-30;  colParam2=2;
colAction=VELOCITY;     colTime=10;     colParam1=-15;  colParam2=0.4;
colAction=VELOCITY;     colTime=0;      colParam1=-10;  colParam2=1;
colAction=VELOCITY;     colTime=45;     colParam1=-60;  colParam2=11;
colAction=TEMPERATURE;  colTime=120;    colParam1=95;
colAction=TEMPERATURE;  colTime=20;     colParam1=57;
colAction=TEMPERATURE;  colTime=25;     colParam1=95;
colAction=LOOP;                         colParam1=22;   colParam2=7;     colParam3=23;
colAction=TEMPERATURE;  colTime=20;     colParam1=95;
colAction=VELOCITY;     colTime=0;      colParam1=-10;  colParam2=11;
colAction=VELOCITY;     colTime=1;      colParam1=-1;   colParam2=5;
colAction=VELOCITY;     colTime=5;      colParam1=-20;  colParam2=11;

У меня есть функция, которая устанавливает температуру, и функция, которая устанавливает скорость. параметр colTime говорит мне, как долго я должен удерживать скорость или температуру, не следуя следующей инструкции. по истечении времени colTime мне нужно следовать следующей инструкции: если за температурой следует другая температура, я просто присваиваю функции следующее значение, но если за температурой следует скорость, мне нужно поддерживать функцию температуры при запуске функция скорости. Проблема возникает, когда после установки температуры скорость следует за другой температурой. Теперь мне нужно сохранить скорость и установить другую температуру. И я не знаю, как это сделать. Я надеюсь, что смогу как-то прояснить свою проблему, и это не слишком смущает.

1 Ответ

0 голосов
/ 07 сентября 2018

Обычно процесс может рассматриваться как стек вызовов функций / процедур / методов. В любой момент времени ваша программа будет находиться в одной точке вашего кода.

Когда мы добавляем в программу несколько потоков вместо одного стека, теперь у нас будет несколько стеков вызовов функций / процедур / методов. Каждый из них будет в любой момент времени находиться в разных точках вашего кода.

В C / C ++ ваш основной поток (тот, который все это запустил) будет иметь в нижней части стека функцию int main(int argc,char**argv). Это относится как к однопоточному, так и к основному потоку многопоточной программы.

Как насчет остальных тем. Ну, для каждого из них вы укажете стартовую функцию. Потоки (и основные потоки) начнут выполнение в начале функции start и будут выполняться до конца. Поток будет жив, пока выполняется его начальная функция.

Теперь думаю о вашем коде. Одной из многих возможностей является создание потока для выполнения ваших функций температуры или скорости. Это было бы вашей стартовой функцией для вновь созданного потока. Вы можете join() из порождающей нити ждать его завершения.

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

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

Но возникает другая проблема: доступ / чтение / запись в общую память, потенциально из нескольких потоков, может привести к непредсказуемым результатам. Так что (любой вид) доступ должен быть защищен какой-то синхронизацией (мьютексы, атомика ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...