背景:我为一些非常专业的数据处理创建了许多小型实用程序。通常,我是唯一的用户。我什至没有考虑多线程编程,因为运行时性能对于我的用例来说已经足够了。关键资源是我的编程时间。所以我想避免多线程编程所需的任何额外工作。
然而,当我将来重用我的代码时,似乎存在我的源代码在多线程上下文中执行的风险。
根据Cpp核心指南 http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rconc-multi :
小心:有很多例子表明“已知”的代码
从未在多线程程序中运行,而是作为
多线程程序。往往是多年以后。通常,此类程序
导致消除数据竞争的痛苦努力。因此,代码是
从未打算在多线程环境中运行应该是
明确标记为这样,并且最好带有编译或运行时
尽早发现这些使用错误的强制机制。
同一来源中的大多数建议实际上让我开始了多线程编程。我更愿意遵循的一个建议是:
拒绝在多线程环境中构建和/或运行。
所以我的问题是,我该怎么做?例如。是否有一个包含文件,#pragma 等来确保源文件中所有内容的单线程构建/执行?
With g++
/gcc
编译和链接多线程代码需要使用-pthread
编译器和链接器选项。该选项设置_REENTRANT
您可以在编译时检查的宏:
$ c="g++ -E -dD -xc++ /dev/null"
$ diff <($c) <($c -pthread)
389a390
> #define _REENTRANT 1
与普遍的看法相反,using -lpthread链接器选项是不必要的,并且不足以正确构建多线程程序 https://stackoverflow.com/a/62561519/412080.
Microsoft Visual Studio 套装_MT
用于多线程构建的宏,IIRC。
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
macro.
如果以多线程模式构建,以下会导致编译错误:
#if defined(BOOST_HAS_THREADS) || defined(_REENTRANT) || defined(_MT)
#error This code is single-threaded only.
#endif
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)