【发布时间】:2018-08-06 06:21:44
【问题描述】:
我们知道 CPU 和编译器可能会重新排序我们的代码,当我们加载/存储共享内存时,如果我们不涉及锁(或一些类似的工具),结果是不确定的。 C++ 11 提出memory model 来定义多线程操作共享内存时的行为。
clang 或 CPU 会重新排序 OC 代码吗?如果是这样,OC 是否应该在 C++ 11 中拥有类似内存模型的标准?
【问题讨论】:
标签: c++ ios objective-c clang
我们知道 CPU 和编译器可能会重新排序我们的代码,当我们加载/存储共享内存时,如果我们不涉及锁(或一些类似的工具),结果是不确定的。 C++ 11 提出memory model 来定义多线程操作共享内存时的行为。
clang 或 CPU 会重新排序 OC 代码吗?如果是这样,OC 是否应该在 C++ 11 中拥有类似内存模型的标准?
【问题讨论】:
标签: c++ ios objective-c clang
您提供的内存模型链接基本上是在说:
线程之间存在竞争条件
缓存一致性问题,例如一个线程先写入 A 然后 B,但另一个线程在 A 上的更改之前看到 B 上的更改,这是真实的。
线程之间的无锁编程非常难以正确进行,但如果您喜欢以困难的方式做事,这就是绳索 (std::memory_order)。
使用锁原语(包括 std::mutex)是编写正确多线程代码的解决方案。
即使 Objective-C 本身没有正式记录内存模型,也存在相同的数据竞争和一致性问题。并且使用正确的线程/锁定原语仍然是解决方案。
【讨论】: