小编Dav*_*vid的帖子

互斥锁功能是否足够而没有易失性?

我和同事为在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()是一个特殊函数,所以我们只是受序列点保护吗?

非常感谢.

更新:好的,我可以看到一个趋势,答案解释了为什么不稳定是坏的.我尊重这些答案,但有关该主题的文章很容易在网上找到.我在网上找不到的,以及我问这个问题的原因,就是我如何保护我没有不稳定.如果上面的代码是正确的,那么缓存问题如何无懈可击?

c++ multithreading mutex volatile memory-barriers

39
推荐指数
3
解决办法
7299
查看次数

我可以用更新的gcc/clang来定位旧的linux吗?C++

现在我使用提供的gcc在某个旧版本的Linux(SLED 10)上编译我的C++软件,它可以在大多数新版本上运行,因为它们有更新的glibc.问题是,旧的gcc不支持C++ 11,我真的很想使用新功能.

现在我有一些想法,但我相信其他人也有同样的需求.什么对你有用?

思路:

  1. 构建一个更新的系统,静态链接到更新的glibc.(不可能,对吧?)
  2. 构建在较新的系统上,编译并链接旧的glibc.
  3. 使用更新的gcc构建旧系统,链接旧glibc.
  4. 构建一个更新的系统,动态链接到更新的glibc,设置RPath并为我们的glibc提供安装程序.

作为奖励,我的软件也支持插件并有一个SDK.我真的更喜欢我的客户可以编译我的库而不会有太大的麻烦.

提前致谢.欢迎提供,经过验证的解决方案

c++ linux glibc

13
推荐指数
1
解决办法
1963
查看次数

我可以在项目之间共享预编译头以减少编译时间吗?

我在Visual Studio中有近200个项目,构建它们需要很长时间.我注意到为每个项目构建stdafx.cpp(预编译头)很慢.我为每个项目使用相同的标题,为什么我要构建它〜200次?如何构建它并在项目之间共享?

precompiled-headers visual-studio

6
推荐指数
1
解决办法
1246
查看次数