如何在源代码中强制执行单线程构建

2024-01-16

背景:我为一些非常专业的数据处理创建了许多小型实用程序。通常,我是唯一的用户。我什至没有考虑多线程编程,因为运行时性能对于我的用例来说已经足够了。关键资源是我的编程时间。所以我想避免多线程编程所需的任何额外工作。

然而,当我将来重用我的代码时,似乎存在我的源代码在多线程上下文中执行的风险。

根据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(使用前将#替换为@)

如何在源代码中强制执行单线程构建 的相关文章

随机推荐

  • mod_rewrite:允许重定向但阻止直接访问

    我目前正在使用 mod rewrite 进行内部重定向 RewriteCond REQUEST URI pattern RewriteRUle file php 但是我想阻止直接访问file php通过将对该文件的请求重定向到找不到页面的
  • 如何将 MediaRecorder 录制的视频长度读取到通过 context.getFilesDir() 构建的私有应用程序存储目录中?

    我在使用 MediaRecorder 读取设备摄像头录制的视频文件的长度 持续时间时遇到一个奇怪的问题 该文件被记录到应用程序的私有存储目录 中 设置如下 mMediaRecorder setOutputFile context getFi
  • UIPanGestureRecognizer - 仅垂直或水平

    我有一个观点UIPanGestureRecognizer垂直拖动视图 所以在识别器回调中 我只更新 y 坐标来移动它 该视图的超级视图有一个UIPanGestureRecognizer这将水平拖动视图 仅更新 x 坐标 问题是第一个UIPa
  • SQL Server 代理作业运行缓慢

    我正在 SQL Server 2005 中使用 SQL Server 代理作业执行存储过程 直到昨天 这项工作进展得很快 从昨天开始 这项工作需要 1 个多小时 而不是 2 分钟 我在SSMS中执行了存储过程 只用了不到1分钟就执行完了 我
  • 未处理的拒绝错误 Bluebird

    我有以下代码 它按预期工作 不会引发未处理的拒绝错误 p new Promise fulfill reject gt reject new Error some error p catch error gt console log erro
  • 检查密码 - 代码错误在哪里?

    密码验证代码 但不起作用 我的代码错误在哪里 JS function checkPass var pass document getElementById pass var pass2 document getElementById pas
  • 在 Ubuntu 18.04 上安装 sbt 时出错:“gpg:密钥服务器接收失败:参数无效”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在关注官方 sbt 安装说明 https www scala sbt org 1 x docs Installing sbt
  • 在 Makefile 脚本中读取用户输入

    我有一个非常简单的 Makefile 只是递归调用另一个子目录 make all cd addons godot haskell plugin make cd run cd addons godot haskell plugin make
  • 如何使用nosetests分别组织和运行单元测试和功能测试

    我有以下典型的 python 项目文件结构 packageA subpackage1 classa py subpackage2 classb py test subpackage1 classa test py subpackage2 c
  • 链接 boost 库时程序退出且没有错误

    我在将 boost 库链接到交叉编译的 C 程序中时遇到问题 我编写的代码是在 Ubuntu 12 04 下与 CodeSourcery 交叉编译的 用于 arm 目标 Pandaboard 也是 Ubuntu 12 04 在没有库的情况下
  • 在循环内绑定 PDO 语句的参数

    我正在尝试在循环内绑定 SQL 查询的参数 db new PDO mysql dbname test host localhost test stmt db gt prepare INSERT INTO entries VALUES NUL
  • 如果为 null,则设置为新实例的 C# 扩展方法

    我有以下扩展方法来帮助我检查和实例化对象 如果它们为空 前两个工作正常 但不是很有用 public static bool IsNull
  • 在 Mac 上的 Python 中创建消息框?

    目前正在学习 Cybrary 的免费 Python 在线课程 我正在使用 3 6 进行编码 但我使用的是 Mac 而演示者使用的是 Windows 到目前为止 如果有的话 差异也很小 然而 当前部分涉及学习和使用 Ctypes 作业 说的是
  • Postgresql - 在 sql 脚本中将参数传递给 COPY

    我可以使用 v v1 foo语法对于我的 sql 脚本中的查询来说很好 但我不知道如何在复制语句中使用该参数 我想执行如下脚本 psql d my db f exports sql v v1 Users username test json
  • 如何在 GWT 中使用 XMLHttpRequest?

    XMLHttpRequest 是 GWT 客户端 HTTP 调用的替代方案 允许控制请求 响应的各个方面 但如何使用呢 javadoc地址 http www gwtproject org javadoc latest com google
  • Django url 参数和反向 URL

    我有一个看起来像这样的视图 def selectCity request the city request session ciudad the city city request session ciudad return HttpRes
  • OAuth 自定义提供程序 C#

    我需要创建一个自己的 OAUTH 提供商 以验证第三方应用程序请求 我不想使用 Google Twitter LinkedIn Microsoft 提供商 我必须创建自己的提供程序来验证请求并向客户端返回访问令牌 但网上的所有帮助都与外部提
  • 授权属性的 MVC5 声明版本

    我正在使用 MVC5 和新的 OWIN 身份验证中间件尝试 VS2013 RC 中的一些新功能 所以 我习惯使用 Authorize 属性来按角色限制操作 但我正在尝试使用基于声明 活动的授权 但我找不到它的等效属性 我是否缺少一个明显的东
  • XMPP Bosh 与 SignalR

    XMPP相对于SignalR有更多优势吗 它们都使用 http 长轮询机制 我无法决定是否应该使用 XMPP 作为我的聊天应用程序 还是应该使用 SignalR 并将所有内容保留在我的 IIS 服务器上 SignalR 使用多种传输方式 请
  • 如何在源代码中强制执行单线程构建

    背景 我为一些非常专业的数据处理创建了许多小型实用程序 通常 我是唯一的用户 我什至没有考虑多线程编程 因为运行时性能对于我的用例来说已经足够了 关键资源是我的编程时间 所以我想避免多线程编程所需的任何额外工作 然而 当我将来重用我的代码时