【发布时间】:2019-04-22 08:28:11
【问题描述】:
给定以下 C 程序:
static char vals[ 2 ] = {0, 0};
int main() {
char *a = &vals[0];
char *b = &vals[1];
while( 1 ) {
SOME_STUFF()
// non-atomic operations in critical section
if( SOME_CONDITION() )
{
*a = 1;
*b = 2;
}
else
{
*a = 0;
*b = 0;
}
SOME_OTHER_STUFF()
}
return 0;
}
int async_interrupt( void ) {
PRINT( a );
PRINT( b );
}
硬件是否有可能首先将值2 加载到内存位置&vals[1] 中,以便执行中断例程并查看vals[1] == 2 和vals[0] == 0?
如果这是可能的,任何会导致这种情况的加载/存储操作的描述将不胜感激。
编辑 1:在代码部分添加了更多上下文。不幸的是,我没有编译后的源代码。
【问题讨论】:
-
是的;程序也可以优化为
int main() { return 0; },因为它没有可观察到的行为 -
发布您询问的“中断例程”示例会改善问题。一般来说,如果中断例程试图访问
a或b,这将是未定义的行为,所以这个问题可能没有实际意义。此外,某些平台为中断例程提供比标准 C 更强的保证。 -
如果中断例程访问了
vals[0]或vals[1],则也是UB。 (a和b是具有自动存储功能的本地人,因此没有好的方法可以通过中断来获取它们。不确定它们的意义。)
标签: c interrupt memory-model signal-handling