- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我们有两个线程。一个“开始”,一个等待“开始”以产生某种东西。
此代码是否正确,或者我是否可以因为缓存或类似原因而出现“无限循环”?
std::atomic_bool canGo{false};
void producer() {
while(canGo.load(memory_order_relaxed) == false);
produce_data();
}
void launcher() {
canGo.store(true, memory_order_relaxed);
}
int main() {
thread a{producer};
thread b{launcher};
}
如果这段代码不正确,有没有办法在标准 C++ 中刷新/使缓存失效?
最佳答案
像这样的开始信号通常会响应您希望目标看到的一些内存变化。
换句话说,您通常希望为此类信号提供release/acquire 语义。
这可以通过在存储上使用 memory_order_release
和在加载上使用 memory_order_acquire
来完成,或者通过放置一个release fence 在松弛存储之前和获取围栏之后松弛加载,以便信号发送者在存储之前完成的内存操作对信号接收者可见(参见例如,https://preshing.com/20120913/acquire-and-release-semantics/ 或 C/C++ 标准)。
我记得栅栏的顺序是,据我所知,内核之间的共享内存操作实际上是 hardware implemented buffered IO that follows a protocol,释放栅栏应该类似于输出缓冲区刷新,而获取栅栏类似于输入缓冲区刷新/同步。
现在,如果您在发出宽松存储之前刷新核心的内存操作输出缓冲区,那么当目标核心看到宽松存储时,前面的内存操作消息必须对它可用并且它需要的一切在其内存中查看这些内存更改是在看到信号存储后将它们与获取栅栏同步。
关于c++ - 放宽顺序作为信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56906486/
写作 Inductive Foo : Type -> Type := | foo : Foo Bar with Bar := . 给 Error: Non strictly positive occu
是否可以使 Relax NG 元素/属性独一无二? 例如属性: 引用: t1 t2 t3 现在我必须验证一
是否可以在 VS 2008 C/C++ 编译器下,将以下代码编译成 .c 文件/作为 .c 文件? int f(int bounds) { int sum = 0; for( int i
背景: 我有一个小型的 JavaScript 支持的小部件,它使用来自另一个来源的数据。我在本地 IDE 中使用以下外部(非原始)数据成功测试了它: https://www.google.com/fi
我是一名优秀的程序员,十分优秀!