这里是一些可以从多个线程并行访问的C++代码。它有一个关键部分:用锁重新排列声明
lock.Acquire();
current_id = shared_id;
// small amounts of other code
shared_id = (shared_id + 1) % max_id;
lock.Release();
// do something with current_id
锁定变量的类是POSIX互斥体实现的包装。由于模块操作,不可能使用原子操作。
是否有可能带有O3标志的gcc编译器优化了代码,以便在锁之前移动current_id的赋值?
你的意思是“除非函数被标记为纯**或者编译器能够确定它是安全的**。当然,最终结果是一样的,编译器一般不会进行优化,除非它可以验证它是安全的。 – jalf 2010-01-22 18:38:06
如果'current_id'和'shared_id'都是没有逃过当前作用域的局部变量(地址没有给任何其他人,等等),那么优化器可以重新排列这些行,而忽略来自外部函数调用的可能的突变,不过我认为在这里并不是这样, – ephemient 2010-01-22 19:15:36
@ephemient:但是如果它们是本地的而且没有外部的一个人都知道外部函数调用如何修改它们? – Kosi2801 2010-01-24 11:00:40