背景:我为一些非常专业的数据处理创建了许多小型实用程序。通常,我是唯一的用户。我甚至不考虑多线程编程,因为运行时性能对我的用例来说已经足够了。关键的资源是我的编程时间。因此,我希望避免多线程编程所需的额外工作。
然而,当我在将来重用我的代码时,我的源代码在多线程环境中被执行,这似乎是有风险的。
根据CppCoreGuidelines的说法:
注意:有许多例子表明,在多线程程序中“已知”永不运行的代码是作为多线程程序的一部分运行的。通常是几年后。通常,这样的程序会导致删除数据竞赛的痛苦努力。因此,不打算在多线程环境中运行的代码应该明确地标记为多线程环境,并在理想情况下附带编译或运行时执行机制,以便尽早捕获这些使用错误。
在同一个源代码中的大多数建议实际上让我开始了多线程编程。我喜欢遵循的一个建议是:
拒绝在多线程环境中构建和/或运行。
所以我的问题是,我该怎么做?例如,是否有一个包含文件、#杂注之类的文件来确保源文件中所有内容的单线程构建/执行?
发布于 2018-04-24 10:49:50
对于g++/gcc,编译和链接多线程代码需要使用-pthread编译器和链接器选项。此选项设置_REENTRANT宏,您可以在编译时检查该宏:
$ c="g++ -E -dD -xc++ /dev/null"
$ diff <($c) <($c -pthread)
389a390
> #define _REENTRANT 1与流行的观点相反,链接器选项没有必要,也不足以正确构建多线程程序。。
Microsoft为多线程生成设置_MT宏。
Boost库执行以下操作:
// Turn on threading support if the compiler thinks that it's in
// multithreaded mode. We put this here because there are only a
// limited number of macros that identify this (if there's any missing
// from here then add to the appropriate compiler section):
//
#if (defined(__MT__) || defined(_MT) || defined(_REENTRANT) \
|| defined(_PTHREADS) || defined(__APPLE__) || defined(__DragonFly__)) \
&& !defined(BOOST_HAS_THREADS)
# define BOOST_HAS_THREADS
#endif以便您可以#include <boost/config.hpp>,然后检查BOOST_HAS_THREADS宏的值。
如果编译模式是以多线程模式生成的,则以下内容将导致编译错误:
#if defined(BOOST_HAS_THREADS) || defined(_REENTRANT) || defined(_MT)
#error This code is single-threaded only.
#endifhttps://stackoverflow.com/questions/49997217
复制相似问题