编译boost时`threading=multi`到底做了什么?

2023-11-22

我不完全确定到底是什么threading=multiflag 在构建 boost 时会起作用。文档说:

 Causes the produced binaries to be thread-safe. This requires proper
 support in the source code itself.

这似乎不是很具体。这是否意味着对例如 boost 容器的访问受到保护mutexes/locks或类似的?由于我的代码的性能至关重要,我想尽量减少任何不必要的互斥体等。

更多细节:

我的代码是一个插件 DLL,它被加载到多线程第三方应用程序中。我将 boost 静态链接到 DLL 中(除了标准 Windows DLL 之外,插件不允许有任何其他依赖项,所以我被迫这样做)。

尽管该应用程序是多线程的,但我的 DLL 中的大多数函数仅从单个线程调用,因此不需要保护对容器的访问。我明确保护代码的其余位置,可以通过使用从多个线程调用boost::mutex和朋友。

我尝试过用两者来增强threading=multi and threading=single两者似乎都有效,但我真的很想知道我在这里做什么。


No, threading=multi并不意味着像 boost 容器这样的东西会突然变得可以安全地进行多个线程的并发访问(从性能的角度来看,这将是非常昂贵的)。

更确切地说,这意味着什么理论上boost 将被编译为线程感知。基本上,这意味着当从多个线程访问时,boost 方法和类将以合理的默认方式运行,就像 std 库中的类一样。这意味着您无法访问同一个物体从多个线程,除非另有说明,但您可以安全地从多个线程访问不同的对象。即使没有明确的支持,这似乎是显而易见的,但任何static如果不受到保护,库使用的状态将破坏该保证。使用threading=multi保证任何此类共享状态都是由互斥锁或其他机制保护的财产。

过去,类似的参数或 stdlib 风格可用于我的编译器提供的 C 和 C++ std 库,尽管现在大多只有多线程版本可用。

编译可能没有什么缺点threading=multi,假设只需要同步有限数量的静态。您的评论认为您的图书馆将mostly只被一个线程调用并不能激发很大的信心——毕竟,这些潜在的错误会导致你在喝了一晚上的酒后凌晨 3 点被老板叫醒。

boost的例子shared_ptr内容丰富。和threading=single,甚至不能保证两个的独立操纵shared_ptr来自多个线程的实例是安全的。如果它们碰巧指向同一个对象(或者,理论上,在某些奇异的实现下,即使它们没有),您将生成未定义的行为,因为共享状态不会通过适当的保护进行操作。

With threading=multi,这不会发生。然而,它仍然是not safe访问相同的shared_ptr来自多个线程的实例。也就是说,它不提供任何未针对相关对象记录的线程安全保证 - 但它确实提供了独立对象独立的“预期/合理/默认”保证。这种默认的线程安全级别没有一个好名字,但实际上它是当今多线程语言的所有标准库通常提供的。

最后一点,值得注意的是Boost.Thread总是隐式编译为threading=multi- 因为使用 boost 的多线程类是存在多个线程的隐式暗示。使用Boost.Thread没有多线程支持将是无意义的。

现在,综上所述,以上是编译 boost“带线程支持”或“不带线程支持”背后的理论思想,这就是threading=旗帜。实际上,自从引入此标志后,多线程已成为默认设置,而单线程则成为例外。事实上,许多默认为单线程行为的编译器和链接器现在默认为多线程 - 或者至少只需要一个“提示”(例如,命令行上存在 -pthread )即可切换到多线程。

除此之外,我们还共同努力使 boost 构建变得“智能”——当环境有利时,它应该切换到多线程模式。这是相当模糊的,但必然如此。它变得与弱链接 pthreads 符号一样复杂,因此使用 MT 或 ST 代码的决定实际上推迟到运行时 - 如果 pthreads 在执行时可用,则将使用这些符号,否则弱链接存根 - 不执行任何操作根本-将被使用。

底线是threading=multi对于您的场景来说是正确且无害的,特别是如果您正在生成要分发到其他主机的二进制文件。如果你不特别的话,那就是极有可能由于构建时甚至运行时启发法,它无论如何都会起作用,但是您确实有机会默默地使用空存根方法,或者以其他方式使用 MT 不安全代码。使用正确的选项几乎没有什么缺点 - 但一些血淋淋的细节也可以在这一点的评论以及伊戈尔的回复中找到。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译boost时`threading=multi`到底做了什么? 的相关文章

  • Windows Defender 检测 Python EXE 为木马

    我制作了一个 Python 脚本 将 Windows 目录以 zip 形式邮寄给我 我使用 sched 模块添加了一个调度程序 每小时重复一次 我试图制作一个简单的同步应用程序供个人使用 在 Windows 启动时启动 我使用将其转换为 e
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • PyCharm - 如何挂起所有线程

    我们使用 PyCharm 5 0 1 进行多线程调试 当它在断点处停止时 只有特定线程停止 而所有其他线程继续 这使得 冻结时刻 和检查参数值以及其他线程的当前状态变得困难 当其中一个线程在断点处停止时 是否可以挂起所有线程 这在最新的 P
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 有适用于 Windows 的 Bonjour SDK 吗?

    我想知道如何在 Windows 上实现 bonjour 以便我可以在 Windows 上设置服务器并使用 iphone 客户端 中的 bonjour 服务访问 Windows 服务器 中的文件 谁能告诉我我们是否有适用于 Windows 的
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • phoenix 框架 - 新套接字处的参数无效 - windows

    我无法运行新的 Phoenix 应用程序 这是我收到的错误 我不确定原因是什么 我尝试更改端口 但这并没有改变行为 另外 我似乎能够正确运行节点 Compiled web views error view ex Compiled web c
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐