我和同事为在x86,x64,Itanium,PowerPC和其他10年历史的服务器CPU上运行的各种平台编写软件.
我们刚刚讨论了pthread_mutex_lock()... pthread_mutex_unlock()等互斥函数本身是否足够,或者受保护变量是否需要是volatile.
int foo::bar()
{
//...
//code which may or may not access _protected.
pthread_mutex_lock(m);
int ret = _protected;
pthread_mutex_unlock(m);
return ret;
}
Run Code Online (Sandbox Code Playgroud)
我担心的是缓存.编译器是否可以在堆栈或寄存器中放置_protected的副本,并在赋值中使用该陈旧值?如果没有,是什么阻止了这种情况发生?这种模式的变化是否易受攻击?
我假设编译器实际上并不理解pthread_mutex_lock()是一个特殊函数,所以我们只是受序列点保护吗?
非常感谢.
更新:好的,我可以看到一个趋势,答案解释了为什么不稳定是坏的.我尊重这些答案,但有关该主题的文章很容易在网上找到.我在网上找不到的,以及我问这个问题的原因,就是我如何保护我没有不稳定.如果上面的代码是正确的,那么缓存问题如何无懈可击?
现在我使用提供的gcc在某个旧版本的Linux(SLED 10)上编译我的C++软件,它可以在大多数新版本上运行,因为它们有更新的glibc.问题是,旧的gcc不支持C++ 11,我真的很想使用新功能.
现在我有一些想法,但我相信其他人也有同样的需求.什么对你有用?
思路:
作为奖励,我的软件也支持插件并有一个SDK.我真的更喜欢我的客户可以编译我的库而不会有太大的麻烦.
提前致谢.欢迎提供,经过验证的解决方案
我在Visual Studio中有近200个项目,构建它们需要很长时间.我注意到为每个项目构建stdafx.cpp(预编译头)很慢.我为每个项目使用相同的标题,为什么我要构建它〜200次?如何构建它并在项目之间共享?