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