如何在经典编译器中使用 std::atomic 或 boost::atomic?
How to use std::atomic or boost::atomic with the classic compiler?
我目前正在使用 C++ Builder 10.1.2 开发一个中型项目,不幸的是,我在其中依赖于 BCC32 classic 编译器(主要是出于可靠性和速度方面的原因) .
对于某些后台解析,如果我可以使用 C++11 的 std::atomic
就好了,但是 classic 编译器无法做到这一点。甚至 boost::atomic
也不可用,因为 BCC32 只能安装 boost V.1.39,它没有内置 boost::atomic
。
所以...
是否有可能将更新的 boost 版本与 classic 编译器一起使用?
是否有一些 ... ::atomic
的替代方案(互斥包装 普通 变量除外)?
您可以自己实现 lock-less std::atomic
,前提是您可以访问程序集。只需为您的 CPU 找出相应的汇编指令并对其进行编码。这样做的简单方法是在 CPU 上使用现代编译器使用 std::atomic
编译一些测试代码,然后查看生成的 ASM。当然,它会是 CPU-dependent 并且您将使用可移植性。
如果您的编译器不允许您使用 ASM 或者您不想将自己嫁给特定的 CPU,您可以依赖 OS-provided API - *nix Windows 具有原子函数族。
我目前正在使用 C++ Builder 10.1.2 开发一个中型项目,不幸的是,我在其中依赖于 BCC32 classic 编译器(主要是出于可靠性和速度方面的原因) .
对于某些后台解析,如果我可以使用 C++11 的 std::atomic
就好了,但是 classic 编译器无法做到这一点。甚至 boost::atomic
也不可用,因为 BCC32 只能安装 boost V.1.39,它没有内置 boost::atomic
。
所以...
是否有可能将更新的 boost 版本与 classic 编译器一起使用?
是否有一些
... ::atomic
的替代方案(互斥包装 普通 变量除外)?
您可以自己实现 lock-less std::atomic
,前提是您可以访问程序集。只需为您的 CPU 找出相应的汇编指令并对其进行编码。这样做的简单方法是在 CPU 上使用现代编译器使用 std::atomic
编译一些测试代码,然后查看生成的 ASM。当然,它会是 CPU-dependent 并且您将使用可移植性。
如果您的编译器不允许您使用 ASM 或者您不想将自己嫁给特定的 CPU,您可以依赖 OS-provided API - *nix Windows 具有原子函数族。