声明用锁重新排序

dme*_*ter 5 c++ concurrency

这里有一些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
Run Code Online (Sandbox Code Playgroud)

lock变量的类是POSIX互斥实现的包装器.由于模块操作,不可能使用原子操作.

带有O3标志的gcc编译器是否可能优化代码,以便在锁定之前移动current_id的赋值?

Nil*_*nck 3

可以用O3编译!

除非使用函数属性将函数标记为纯函数,否则编译器永远不会跨函数调用进行优化。

互斥函数不是纯粹的,因此与 O3 一起使用它们是绝对安全的。