在下列情况下我应该使用'Volatile'吗?

时间:2015-06-13 11:01:34

标签: c volatile

考虑到我的应用程序中有多个“.c”源文件。

  

Module1.c

static char status_variable = 0;

Modify1() 
{

   status_variable = 'a';

}

Modify2() 
{

   status_variable = 'x';

}

char GetStatus()
{
   return status_variable;
}

可以根据事件从其他.c文件调用函数Modify(不通过ISR)

  

Module2.C

TakeAction()
 {
    if(GetStatus() == 'a')
    {
        //do something
    }
    else 
    {
        //do something
    }

}

现在我的问题是,我需要在这种情况下将status_variable声明为volatile吗?

EDIT1:

我的应用程序16位微控制器(RL78),我没有使用任何操作系统。

EDIT2:

正如一些人评论的那样,多线程根本不在我的脑海里。我已经为我的应用程序写下了一个简单的非抢占式循环调度程序。我不知道多线程环境以及是什么让变量在这种情况下变得不稳定。它与我的环境有什么不同?如果有人可以详细说明它那么它将是一个很大的帮助。

2 个答案:

答案 0 :(得分:4)

由于declare @sql nvarchar(max); declare @Out1 nvarchar(10); declare @Out2 nvarchar(10); declare @ParmDef nvarchar(max); set @ParmDef = ' @Parm_Out1 nvarchar(10) ' + ', @Parm_Out2 nvarchar(10) ' ; set @sql='EXEC myproc @Parm_Out1 OUTPUT, @Parm_Out2 OUTPUT ' exec sp_executesql @sql, @ParmDef, @Parm_Out1 = @Out1, @Parm_Out2 = @Out2 未绑定到任何:

  • 内存映射外设寄存器
  • 由中断服务程序修改的全局变量
  • 多线程应用程序中的全局变量

您可以安全地跳过status_variable声明中的volatile关键字。

答案 1 :(得分:1)

如果模块可以像@ BlueMoon93那样同时运行(如果线程没有其他锁定机制),你肯定应该使用volatile。但是如果这些模块一个接一个地运行,那么你可以安全地跳过volatile的使用。