我刚开始在编码时使用线程,并且不确定我是否正确理解了它们的工作方式。 如果我做对了,可以使用一个线程使两个函数同时运行。在仍然并行运行的情况下,是否可以更改赋予功能之一的值? 就我而言,我从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到期时,我需要遵循下一条指令:如果某个温度后接另一个温度,我只是给函数提供下一个值,但是如果温度后接速度,则我需要在启动时保持温度函数运行速度函数。 出现问题时,在设定温度之后,速度又跟随另一个温度。现在,我需要保持速度运行并设置另一个温度。而且我不知道该怎么做。 我希望我可以以某种方式弄清楚我的问题,并且不要太困惑。
答案 0 :(得分:0)
通常可以看到一个过程是函数/过程/方法调用的堆栈。在任何时候,您的程序都将位于代码的单个位置。
当我们在程序中添加多个线程而不是单个堆栈时,我们现在将具有函数/过程/方法调用的多个堆栈。它们中的每一个都会在任何时间点位于您代码的不同位置。
在C / C ++中,您的主线程(启动所有线程)将在堆栈的底部具有int main(int argc,char**argv)
函数。这适用于单线程程序和多线程程序的主线程。
其余线程如何处理。好吧,您将为每个按钮指定一个启动功能。线程(和主线程)将在start函数的开头开始执行,并一直运行到结尾。在执行启动函数时,该线程将保持活动状态。
现在考虑您的代码。许多可能性之一是产生一个线程来执行温度或速度函数。那将是您新生成的线程的启动函数。您可以从生成线程中join()
来等待它完成。
关于线程与其他组织代码的多处理方式(例如繁重的进程)的关系是,尽管我们已经看到每个线程都有自己的调用堆栈,但是它们都共享相同的内存。
因此,虽然无法修改线程启动函数的参数(该训练已经通过)……但是,代码的其他部分可以简单地更改内存(共享)中的某些值,并且线程的启动功能可以定期检查内存以检测更改并修改其行为。
但是,这带来了一个不同的问题:可能从多个线程访问/读取/写入共享内存可能导致不可预测的结果。因此,(任何一种)访问都必须通过某种同步保护(互斥体,原子...)