int x;
...
void update_x() {
lock();
x = x*5+3;
unlock();
}
谢谢,伊利亚
在C11之前,答案是否定的,因为规范没有定义多个线程做什么,所以任何使用多个线程的程序,其中一个线程写入对象,另一个线程读取对象,都是未定义的行为。
在C11中,实际上有一个内存模型讨论了多线程和数据竞争,因此答案是肯定的,只要锁/解锁例程执行某些同步操作(包括执行同步的库函数或对特殊_atomic
对象的操作)。
由于C11规范试图对现有实现的行为进行代码化(大部分),因此即使在C11之前的实现上,任何执行其要求的代码(即,使用实现提供的库进行锁定,或者使用实现提供的扩展进行原子操作)也很可能会正确工作。
所有的中断函数都能正常工作,但是过程函数却让我很生气。 我会感激任何我没注意的把戏。
在阅读了这个问题和这个(尤其是第二个答案)之后,我对volatile及其关于记忆障碍的语义感到非常困惑。 在上面的例子中,我们写入一个易失性变量,这会导致一个mitch,这反过来会将所有挂起的存储缓冲区/加载缓冲区刷新到主缓存,使其他缓存行无效。 然而,非易失性字段可以优化并存储在寄存器中,例如?那么,我们如何才能确保给定一个写入易失性变量之前的所有状态变化都是可见的呢?如果我们有1000件东西呢
当线程读取易失性变量时,它不仅会看到易失性的最新更改,还会看到导致更改的代码的副作用 这是在http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html提到的 有人可以举个例子吗? 这首先给我的印象是,读取可变变量的线程将与编写器线程同步,并等待写入完成。但事实显然并非如此。 举个例子会很有帮助,非常感谢。 谢谢,
根据JLS 17规范第17.3节: 例如,在下面的(断开的)代码片段中,假设这是。“完成”是一个非易失性布尔字段: 编译器可以自由读取此字段。只执行一次,并在每次执行循环时重用缓存的值。这意味着循环永远不会终止,即使另一个线程更改了这个值。完成 我尝试模拟以下示例:两个线程同时访问同一个布尔变量,第一个线程使用while循环中的共享布尔值,第二个线程更新布尔值。 1、代码无线程。第一个线程内的sl
来自C/C++,我对Java中的volatile对象行为有点困惑。 null faik,volatile意味着b引用的“book对象”应该在主内存中。编译器可能在内部实现引用作为指针,因此b指针可能位于缓存中。我的理解是,volatile是对象的限定符,而不是引用/指针的限定符。 问题是:在使用方法中,本地引用不是易失性的。这个“本地”引用会不会把底层的Book对象从主存带到缓存中,实质上使对象不
我对下面的代码段有一个问题。结果可能有一个结果[0,1,0](这是用JCStress执行的测试)。那么这是怎么发生的呢?我认为数据写入(data=1)应该在Actor2(guard2=1)中写入到guard2之前执行。我说得对吗?我问,因为很多时候我读到挥发物周围的说明没有重新排序。此外,根据这一点:http://tutorials.jenkov.com/java-concurrency/vola