You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

线程外变量更新滞后一周期:为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:40:23