不安全:storeFence() 和 loadFence() 与 volatile
Unsafe: storeFence() & loadFence() vs volatile
我正在检查 this great post 上的 java 栅栏,其中栅栏用于以下示例,以确保并发线程始终可以读取从其他线程更新的最新值:
// CPU 0:
void shutDownWithFailure(void)
{
failure = 1; // must use SOB as this is owned by CPU 1
SFENCE // next instruction will execute after all SOBs are processed
shutdown = 1; // can execute immediately as it is owned be CPU 0
}
// CPU1:
void workLoop(void)
{
while (shutdown == 0) { ... }
LFENCE // next instruction will execute after all LOBs are processed
if (failure) { ...}
}
我的问题是,针对 volatile
使用栅栏有什么好处。
以上面的例子为例,如果我让 failure
和 shutdown
volatile,它应该达到同样的效果吗?
我会说,所有内容都在与该问题相关的 JEP 171 顶部的“动机”部分中进行了描述。总结一下:它旨在提供一种记录的方式来访问这些机制,并为并发访问提供 类 的进一步实现和扩展。
并不意味着使用它们总是优于 volatile
。
我正在检查 this great post 上的 java 栅栏,其中栅栏用于以下示例,以确保并发线程始终可以读取从其他线程更新的最新值:
// CPU 0:
void shutDownWithFailure(void)
{
failure = 1; // must use SOB as this is owned by CPU 1
SFENCE // next instruction will execute after all SOBs are processed
shutdown = 1; // can execute immediately as it is owned be CPU 0
}
// CPU1:
void workLoop(void)
{
while (shutdown == 0) { ... }
LFENCE // next instruction will execute after all LOBs are processed
if (failure) { ...}
}
我的问题是,针对 volatile
使用栅栏有什么好处。
以上面的例子为例,如果我让 failure
和 shutdown
volatile,它应该达到同样的效果吗?
我会说,所有内容都在与该问题相关的 JEP 171 顶部的“动机”部分中进行了描述。总结一下:它旨在提供一种记录的方式来访问这些机制,并为并发访问提供 类 的进一步实现和扩展。
并不意味着使用它们总是优于 volatile
。