单线程C++程序中的同步

问题描述 投票:0回答:1

我有一个程序,其主循环接收消息。 其中一条消息是 registersReady。比我第一次想读取寄存器状态。结果将通过主循环作为事件提供并存储在全局变量中。 在registersReady消息之后,可以接收到消息registersChanged。我也想将结果存储在全局变量中。

在伪代码中,它是这样的:

    Data data;
    while (true){
        message = recv();
        switch (message){
        case registersReady:
            readInitialRegistersState();
        case readInitialRegisterStateFinished:
            data = message.data;
        case registersChanged:
            data = message.data;
    }

如果 registersChanged 在 readInitialRegisterStateFinished 之前发生,则可能会出现该问题。 在这种情况下如何避免数据竞争?有什么模式吗?我无法使用互斥体和条件变量等机制。这是一个线程程序,我只能通过主接收循环接收消息。

兄弟。 阿不思

我试图找到在这种情况下如何避免比赛的模式,但我找不到。 我将不胜感激您的帮助。

c++ race-condition
1个回答
0
投票

只需创建一个标志 registers_ready 并在完成初始注册后设置它。并且不要忘记用break结束每个case部分:

bool registers_ready=false;

Data data;
while (true){
    message = recv();
    switch (message){
    case registersReady:
        readInitialRegistersState();
        break;
    case readInitialRegisterStateFinished:
        data = message.data;
        registers_ready=true;
        break;
    case registersChanged:
        if (registers_ready) {
            data = message.data;
        }
        break;
}

根据您的数据变量格式和值范围,您可以将其用作标志(例如,如果它采用非零值)。

© www.soinside.com 2019 - 2024. All rights reserved.