在这里,一些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的分配移动?
最佳答案
可以用O3编译!
除非使用函数属性将函数标记为纯函数,否则编译器将永远不会在函数调用之间进行优化。
互斥锁功能不是纯函数,因此将它们与O3一起使用绝对是安全的。
关于c++ - 带锁的语句重新排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2119477/