我有一个程序,其主循环接收消息。 其中一条消息是 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 之前发生,则可能会出现该问题。 在这种情况下如何避免数据竞争?有什么模式吗?我无法使用互斥体和条件变量等机制。这是一个线程程序,我只能通过主接收循环接收消息。
兄弟。 阿不思
我试图找到在这种情况下如何避免比赛的模式,但我找不到。 我将不胜感激您的帮助。
只需创建一个标志 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;
}
根据您的数据变量格式和值范围,您可以将其用作标志(例如,如果它采用非零值)。