首页 文章
  • 605 votes
     answers
     views

    易失性与联锁对抗锁定

    假设一个类有一个由多个线程访问的 public int counter 字段 . 此 int 仅递增或递减 . 要增加此字段,应使用哪种方法,为什么? lock(this.locker) this.counter++; , Interlocked.Increment(ref this.counter); , 将 counter 的访问修饰符更改为 public volatile . ...
  • 87 votes
     answers
     views

    说明C#中volatile关键字的用法

    我想编写一个程序,它可以直观地说明 volatile 关键字的行为 . 理想情况下,它应该是一个程序,它执行对非易失性静态字段的并发访问,并因此而获得不正确的行为 . 在同一程序中添加volatile关键字应该可以解决问题 . 那是我无法实现的 . 即使尝试多次,启用优化等,我总是会在没有'volatile'关键字的情况下获得正确的行为 . 你对这个话题有什么看法吗?你知道如何在一个简单的演示应用...
  • 6 votes
     answers
     views

    是否访问不能从C语言中的函数可观察行为外部访问的volatile变量?

    在C 03中,标准可观察行为(1.9 / 6)包括读取和写入易失性数据 . 现在我有这个代码: int main() { const volatile int value = 0; if( value ) { } return 0; } 它正式初始化一个volatile变量然后读取它 . Visual C 10发出机器代码,通过在那里推动dword在堆栈上腾出空...
  • 18 votes
     answers
     views

    易变量

    我最近接受了一家软件公司的采访,他问我以下问题: 你能告诉我在变量前添加volatile的含义是什么吗?你能解释一下为什么这很重要吗? 我的大多数编程知识都来自C,但是工作岗位是针对C#的(我想我可能会根据具体问题的需要添加这些信息) 我回答说它只是让 compiler 知道变量可以跨进程或线程使用,并且它不应该对该变量使用优化;优化它可以恶化行为 . 简而言之,它是对编译器的警告 . 然而,...
  • 547 votes
     answers
     views

    你在Java中使用volatile关键字吗?

    在今天的工作中,我在Java中遇到了 volatile 关键字 . 我不太熟悉它,我发现了这个解释: Java理论与实践:管理波动性 鉴于该文章解释了相关关键字的详细信息,您是否使用过它,或者您是否曾经看到过以正确方式使用此关键字的情况?
  • 11 votes
     answers
     views

    指针指向非易失性对象的指针行为的要求

    C11 6.7.3类型限定词,第7段,内容如下: 具有volatile限定类型的对象可能会以实现未知的方式进行修改,或者具有其他未知的副作用 . 因此,任何涉及这种对象的表达都应严格按照抽象机的规则进行评估,如5.1.2.3所述 . 在以下示例中,第三行中访问的对象是否受上述规则约束? int x; volatile int *p = &x; *p = 42; 换句话说,左值 *p ...
  • 25 votes
     answers
     views

    通过易失性引用/指针访问声明的非易失性对象是否会在所述访问时赋予易失性规则?

    这将是一个漫长的过程,关于它的上下文并提供尽可能多的信息,我必须通过各种链接和引用来蜿蜒 - 这通常是我们进入C / C标准兔子洞后的唯一方法 . 如果您对此帖有更好的引用或任何其他改进,请告诉我 . 但是要事先总结一下,目的是从两个命题中找到真相: Do the C and (by import; see comments) C++ Standards require that access...
  • 0 votes
     answers
     views

    内联析构函数和静态volatile变量

    我正在尝试使用易失性静态变量编写一个非常简单的内存大小计数器来跟踪某个类中的分配 . 我've written the class'析构函数以原子方式递减这个静态的volatile整数,但是编译器(VC VS2010)将它优化掉(内联它,尽管它不应该 - 析构函数中的变量是易变的,也许它应该考虑到这一点......?) . 相反,析构函数似乎永远不会被调用(即类的成员被正确处理掉,但显然不使用自定...
  • 2 votes
     answers
     views

    我可以暂时变量变量吗?

    在PSoC中,可以在内存空间mapped to flash中声明变量 . 由于闪存读取比RAM读取慢,因此程序将受益于编译器优化 - 允许将值存储在寄存器中或以其他方式缓存 . 除了修改闪光灯的值时 . 这可以是done,程序员知道发生的精确时刻 . 这也是相对较少的(为了保护闪存免受写入磨损)并且花费相对长的时间 . 在这种写入的情况下,如果变量从底层存储器恢复其值(表现得像易失性),然后像往常...
  • 3 votes
     answers
     views

    在c中转换volatile变量

    我想我有一个棘手的问题,但我相信你能帮助我 . 假设我有这样的函数: char my_function (int example); 我在多种情况下使用此函数,有时它接收的参数是volatile变量,有时是非易失性变量 . 当我编译可以通过使用强制转换轻松删除的代码时,这会引起一些警告,但我想了解哪个是更安全的场景以及为什么 . 场景1: 原型: char my_function (int ex...
  • 0 votes
     answers
     views

    隐式声明所有变量volatile

    gcc是否有一个选项可以禁用未明确定义为volatile的全局变量的读/写优化? 我的团队在使用gcc构建的嵌入式C项目中耗尽了程序内存 . 当我启用优化来减少代码大小时,代码不再按预期工作,因为我们没有使用我们应该使用的volatile关键字 . 也就是说,我能够通过声明在ISR中访问的一些变量volatile来解决呈现问题 . 但是,我没有任何确定性,那些是我需要声明volatile的唯一变量...
  • 8 votes
     answers
     views

    优化商店/构建易变的堆栈变量是否合法?

    我注意到clang和gcc在某些情况下优化了堆栈上声明的volatile struct 的构造或赋值 . 例如,以下代码: struct nonvol2 { uint32_t a, b; }; void volatile_struct2() { volatile nonvol2 temp = {1, 2}; } Compiles on clang to: volatile_s...
  • -1 votes
     answers
     views

    易失性使用,变量未读取主要内容

    我知道这里有很多关于volatile的问题,但是我没有找到任何特定于这种情况的东西 . 我正在使用微控制器 . 我知道当我在ISR中修改一个全局变量并在我的main函数中读取它时,我必须使用volatile限定符 . 我也觉得非常适合记忆障碍,比赛条件等 . 但是如果我只在主函数中写入一个全局变量(中断被禁用以强制执行原子写入)并且我正在我的ISR中读取和写入它 . 为了给出一个明确的例子假设这个...
  • -1 votes
     answers
     views

    如何指示avr-gcc优化volatile变量?

    中断服务处理程序的代码: volatile unsigned char x = 0; void interruptHandler() __attribute__ ((signal)); void interruptHandler() { f(); g(); } 呼叫: void f() { x ++; } // could be more complex, could also ...
  • 27 votes
     answers
     views

    empty synchronized(this){}对线程之间的内存可见性有什么意义吗?

    我在StackOverflow的评论中读到了这个: 但是如果你想要安全,你可以在@PostConstruct [方法]的末尾添加简单的synchronized(this){} [注意变量不易变化] 我想只有在 synchronized 块中执行write和read或者至少read是volatile时才强制 happens-before . 引用的句子是否正确?空 synchronized(t...
  • 8 votes
     answers
     views

    C“记忆障碍”的例子[重复]

    这个问题在这里已有答案: C++ Memory Barriers for Atomics 2个答案 我正在阅读关于volatile关键字的这个问题的答案: https://stackoverflow.com/a/2485177/997112 这个人说: 防止重新排序的解决方案是使用内存屏障,它向编译器和CPU指示在此点上不能重新排序内存访问 . 在易失性变量访问周围放置这些障碍可确保即使非易...
  • 1 votes
     answers
     views

    易失性与内存栅栏

    下面的代码用于将工作分配给多个线程,将其唤醒,并等待它们完成 . 在这种情况下,“工作”包括“清理卷” . 这个操作究竟做了什么与这个问题无关 - 它只是有助于上下文 . 该代码是巨大的事务处理系统的一部分 . void bf_tree_cleaner::force_all() { for (int i = 0; i < vol_m::MAX_VOLS; i++) { ...
  • 18 votes
     answers
     views

    标准C 11是否保证`volatile atomic <T>`具有语义(volatile atomic)?

    众所周知, std::atomic 和 volatile 是不同的东西 . 有两个主要区别: 两个优化可以用于 std::atomic&lt;int&gt; a; ,但不能用于 volatile int a; : 融合操作: a = 1; a = 2; 可由 a = 2; 上的编译器替换 常量传播: a = 1; local = a; 可由 a = 1; local = 1; 上的编译...
  • 14 votes
     answers
     views

    Java内存模型 - volatile和x86

    我试图理解java volatile的内在函数及其语义,以及它对底层架构及其指令的转换 . 如果我们考虑以下博客和资源 fences generated for volatile,What gets generated for read/write of volatile和Stack overflow question on fences 这是我收集的内容: volatile read在它之后...
  • 9 votes
     answers
     views

    标准定义了volatile变量可以改变的位置?

    标准定义了哪个volatile变量可以不被检测到? 我发现了两个关于volatile的规范性文本: intro.execution/7: 读取由volatile glvalue([basic.lval])指定的对象,修改对象,调用库I / O函数或调用执行任何这些操作的函数都是副作用,这是状态的变化执行环境 . 表达式(或子表达式)的评估通常包括值计算(包括确定用于glvalue评估的对象的身份...
  • 6 votes
     answers
     views

    含有挥发性结构的联盟

    这看起来与POD structs containing constant member类似,但有些相反 . #include &lt;iostream&gt; struct A { int a; }; union U { volatile A a; long b; }; int main() { U u1; U u2; u1.a.a = 12...
  • 4 votes
     answers
     views

    可以通过标记变量volatile来修复不安全类型的惩罚吗?

    在zwol对Is it legal to implement inheritance in C by casting pointers between one struct that is a subset of another rather than first member?的回答中,他给出了一个例子,说明为什么类似结构之间的简单类型转换是不安全的,并且在注释中有一个样本环境,它在其中出现意外...
  • 4 votes
     answers
     views

    使用volatile关键字修改const变量

    我正在回答question并制作了这个测试程序 . #include &lt;stdio.h&gt; int main() { volatile const int v = 5; int * a = &amp;v; *a =4; printf(&quot;%d\n&quot;, v); return 0; } 如果没有volatile关键字,代码将优化(使...
  • 3 votes
     answers
     views

    可以安全地读取C中未初始化的自动易失性变量吗?

    在C中,我可以访问自动volatile变量而不必先进行初始化,还是总是导致未定义的行为? 例如,在映射到volatile变量的一些硬件设备中,初始化变量无论如何都没有意义,甚至可能被禁止 .
  • 2 votes
     answers
     views

    `volatile`是否允许与工会打字?

    我们都知道像这样打字 union U {float a; int b;}; U u; std::memset(u, 0, sizeof u); u.a = 1.0f; std::cout &lt;&lt; u.b; 是C中未定义的行为 . 它是未定义的,因为在 u.a = 1.0f; 赋值后 .a 变为活动字段且 .b 变为非活动字段,并且从非活动字段读取它是未定义的行为 . 我们都知道这一点...
  • 345 votes
     answers
     views

    为什么C需要挥发性?

    为什么C中需要 volatile ?它是干什么用的?它会做什么?
  • 77 votes
     answers
     views

    C volatile关键字是否引入了内存栅栏?

    我知道 volatile 通知编译器可能会更改该值,但为了完成此功能,编译器是否需要引入内存栅栏才能使其工作? 根据我的理解,易失性对象的操作顺序不能重新排序,必须保留 . 这似乎暗示一些内存栅栏是必要的,并且没有真正解决这个问题的办法 . 我说的是对的吗? this related question有一个有趣的讨论 Jonathan Wakely writes: ...对于不同的volati...
  • 189 votes
     answers
     views

    Java中volatile和synchronized之间的区别

    我想知道将变量声明为 volatile 并始终访问Java中 synchronized(this) 块中的变量之间的区别? 根据这篇文章http://www.javamex.com/tutorials/synchronization_volatile.shtml,有很多要说的,有许多不同之处,但也有一些相似之处 . 我对这条信息特别感兴趣: ...访问volatile变量永远不会阻塞:我们只进行...
  • 83 votes
     answers
     views

    易挥发的Vs原子[重复]

    这个问题在这里已有答案: What is the difference between atomic / volatile / synchronized? 7个答案 我读到了下面的某个地方 . Java volatile关键字并不意味着原子,它常见的误解是,在声明volatile之后,操作将是原子的,要使操作原子化,你仍然需要确保使用Java中的synchronized方法或块进行独占访问 ...
  • 243 votes
     answers
     views

    atomic / volatile / synchronized有什么区别?

    原子/易失性/同步如何在内部工作? 以下代码块之间有什么区别? 代码1 private int counter; public int getNextUniqueIndex() { return counter++; } 代码2 private AtomicInteger counter; public int getNextUniqueIndex() { return c...

热门问题