线程外变量更新滞后一周期:为何PLC取值结果不同步?
问题原因解析
先看你提供的代码:
int ok; public void Simulate() { Thread simThread = new Thread(process); simThread.Start(); if(ok == 1) { lblResult.Text = "Ok"; } else { lblResult.Text = " Not Ok"; } } public void process() { GetValFromPLC(); if(PLCval == 1) { ok =1; } else { ok = 0; } }
出现该现象的核心原因有两个:
1. 线程异步执行的时序问题
你在Simulate方法中启动新线程后,当前线程(定时器触发的线程)不会等待新线程执行完毕,会立刻执行后续的ok值判断逻辑:
- 首次触发时,新线程还没完成
GetValFromPLC()调用,更没修改ok变量,当前线程读到的是ok的初始值0,因此显示"Not Ok"。 - 后续每次触发时,当前线程判断
ok时,本次启动的process线程还未完成ok的修改,读到的是上一次线程执行后留下的旧值,所以会出现"滞后一步"的现象。
2. 线程间的内存可见性问题
普通int变量没有线程可见性保障:process线程修改ok后,当前线程可能还在读取自己工作内存中缓存的旧值,无法及时感知到ok的最新变化,这会进一步加剧值更新不及时的情况。
而不使用线程时,代码是同步执行的:先完成process中的所有逻辑(包括修改ok),再执行判断逻辑,自然能读到ok的最新值,因此运行正常。
内容的提问来源于stack exchange,提问作者Alisha
相关产品推荐
相关产品推荐

