当前位置: 首页 > 面试题库 >

为什么volatile可用于setjmp / longjmp

孟楷
2023-03-14
问题内容

调用longjmp()后,如果自setjmp()调用以来其值可能已更改,则不应访问非非易失性合格的本地对象。在这种情况下,它们的值被认为是不确定的,访问它们是未定义的行为。

现在我的问题是,为什么在这种情况下volatile起作用?难道那个可变变量仍然不能使longjmp失败吗?例如,在下面的示例中,longjmp将如何正常工作?当代码在longjmp之后返回到setjmp时,local_var的值不是2而不是1?

void some_function()
{
  volatile int local_var = 1;

  setjmp( buf );
  local_var = 2;
  longjmp( buf, 1 );
}

问题答案:

setjmplongjmp垃圾寄存器。如果变量存储在寄存器中,则其值将在后面丢失longjmp

相反,如果将其声明为volatile,则每次将其写入时,都会将其存储回内存中,并且每次从其读取时,都会将其每次从内存中读取回去。这会损害性能,因为编译器必须执行更多的内存访问,而不是使用寄存器,但是面对变量,这会使变量的使用安全longjmp



 类似资料:
  • 来自Javadocs 使用易失性变量降低了内存一致性错误的风险,因为对易失性变量的任何写入都与同一变量的后续读取建立了先发生后发生的关系。这意味着对易失性变量的更改始终对其他线程可见。 如果对volatile变量所做的更改对任何其他线程都是可见的,那么为什么在多个线程写入该变量的情况下不能使用volatile变量呢。为什么volatile只用于一个线程正在写入或读取该变量,而另一个线程只读取该变量

  • 本文向大家介绍一个指针可以是volatile 吗?解释为什么。 相关面试题,主要包含被问及一个指针可以是volatile 吗?解释为什么。 时的应答技巧和注意事项,需要的朋友参考一下 • 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。  

  • 问题内容: 今天的工作中,我遇到了volatileJava中的关键字。不太熟悉,我找到了这种解释。 鉴于该文章详细解释了所讨论的关键字,您是否曾经使用过它,或者是否曾见过可以正确使用此关键字的情况? 问题答案: volatile具有内存可见性的语义。基本上,volatile字段的值对所有读取器(尤其是其他线程)可见,在该字段上完成写操作之后。没有volatile,读者可能会看到一些未更新的值。 要

  • 问题内容: 关于以下方面,在Linux / gcc上的C ++中使用longjmp和setjmp是否安全? 异常处理(我没有使用longjmp / setjmp实现异常处理。我想知道longjmp / setjmp对标准异常处理有哪些副作用) 指针 讯号 智能指针(boost的共享和侵入指针) 您还能想到的其他任何东西。 问题答案: / 完全颠覆了堆栈展开,因此也破坏了异常处理以及RAII(通常是

  • 主要内容:可见性,原子性,举个例子首先要了解的是,volatile可以保证可见性和顺序性,这些都很好理解,那么它为什么不能保证原子性呢? 可见性 可见性与Java的内存模型有关,模型采用缓存与主存的方式对变量进行操作,也就是说,每个线程都有自己的缓存空间,对变量的操作都是在缓存中进行的,之后再将修改后的值返回到主存中,这就带来了问题,有可能一个线程在将共享变量修改后,还没有来的及将缓存中的变量返回给主存中,另外一个线程就对共享变量

  • 主要内容:可见性,原子性,举个例子首先要了解的是,volatile可以保证可见性和顺序性,这些都很好理解,那么它为什么不能保证原子性呢? 可见性 可见性与Java的内存模型有关,模型采用缓存与主存的方式对变量进行操作,也就是说,每个线程都有自己的缓存空间,对变量的操作都是在缓存中进行的,之后再将修改后的值返回到主存中,这就带来了问题,有可能一个线程在将共享变量修改后,还没有来的及将缓存中的变量返回给主存中,另外一个线程就对共享变量