这里有一些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
lock变量的类是POSIX互斥实现的包装器。由于模块操作,不可能使用原子操作。
带有O3标志的gcc编译器是否有可能优化代码,以便在锁定之前移动current_id的赋值?
答案 0 :(得分:3)
可以用O3编译!
编译器永远不会在函数调用中进行优化,除非使用函数属性将函数标记为纯函数。
互斥功能并不纯粹,因此将它们与O3一起使用绝对安全。
答案 1 :(得分:1)
通常,编译器不应进行此类有害的优化。如果您仍然不确定,可以使用volatile关键字来阻止对该id变量进行优化。