c ++:在线程仍在运行时,可以给它赋予新值吗?还是必须先结束它?

时间:2018-09-07 13:39:35

标签: c++ multithreading function csv

我刚开始在编码时使用线程,并且不确定我是否正确理解了它们的工作方式。 如果我做对了,可以使用一个线程使两个函数同时运行。在仍然并行运行的情况下,是否可以更改赋予功能之一的值? 就我而言,我从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 :(得分:0)

通常可以看到一个过程是函数/过程/方法调用的堆栈。在任何时候,您的程序都将位于代码的单个位置。

当我们在程序中添加多个线程而不是单个堆栈时,我们现在将具有函数/过程/方法调用的多个堆栈。它们中的每一个都会在任何时间点位于您代码的不同位置。

在C / C ++中,您的主线程(启动所有线程)将在堆栈的底部具有int main(int argc,char**argv)函数。这适用于单线程程序和多线程程序的主线程。

其余线程如何处理。好吧,您将为每个按钮指定一个启动功能。线程(和主线程)将在start函数的开头开始执行,并一直运行到结尾。在执行启动函数时,该线程将保持活动状态。

现在考虑您的代码。许多可能性之一是产生一个线程来执行温度或速度函数。那将是您新生成的线程的启动函数。您可以从生成线程中join()来等待它完成。

关于线程与其他组织代码的多处理方式(例如繁重的进程)的关系是,尽管我们已经看到每个线程都有自己的调用堆栈,但是它们都共享相同的内存。

因此,虽然无法修改线程启动函数的参数(该训练已经通过)……但是,代码的其他部分可以简单地更改内存(共享)中的某些值,并且线程的启动功能可以定期检查内存以检测更改并修改其行为。

但是,这带来了一个不同的问题:可能从多个线程访问/读取/写入共享内存可能导致不可预测的结果。因此,(任何一种)访问都必须通过某种同步保护(互斥体,原子...)