给定的是以下函数foo
int x;
void foo()
{
[...]
x = 0x1234;
cv.set();
[...]
}cv是一个非标准的条件变量,由我必须使用的外部API提供。这保证了C++标准给出,所以我可以肯定,x永远不会写在条件变量被设置之后。
条件变量当然在内部使用内存栅栏,但是由于实现在不同的转换单元中,编译器在foo编译期间无法知道这一点。
发布于 2020-01-17 16:51:45
cv是一个非标准的条件变量.什么保证C++标准
没有。该标准不能保证根据定义属于标准范围之外的行为。如果cv没有(内部)使用C++标准认可的东西,那么这个标准就不能谈论它们的行为。
因此,您只有cv的制造者给您的保证,以及您的实现的保证。
话虽如此:
,因为实现在不同的翻译单元中,所以编译器在编译foo时不能知道这一点。
如果编译器看不到某些函数的实现,那么编译器如何知道它是在使用C++ condition_variable还是POSIX之类的东西呢?甚至一点都没有。
编译器不知道某些函数调用不会调用某个标准定义的同步机制,因此实现必须假设它调用了,并且避免以可能违反这种机制的方式重新排序指令。
https://stackoverflow.com/questions/59791607
复制相似问题