声明用锁重新排序

时间:2010-01-22 18:21:13

标签: 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

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

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

2 个答案:

答案 0 :(得分:3)

可以用O3编译!

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

互斥功能并不纯粹,因此将它们与O3一起使用绝对安全。

答案 1 :(得分:1)

通常,编译器不应进行此类有害的优化。如果您仍然不确定,可以使用volatile关键字来阻止对该id变量进行优化。