除非链接到 pthreads,否则不会出现死锁?

2024-05-05

为什么创建 std::mutex 死锁实际上不会导致死锁,除非程序链接到 pthreads?

以下内容在与 pthreads 库链接时会死锁,如果未链接 pthreads 则不会死锁。在 gcc 和 clang 上测试。

// clang++ main.cpp -std=c++14 -lpthread
#include <mutex>
int main() {
    std::mutex mtx;
    mtx.lock();
    mtx.lock();
    return 0;
}

我知道如果没有线程库,您实际上不需要互斥功能,但是编译器是否知道链接的库?并可以在此基础上进行优化吗?


以下内容在与 pthreads 库链接时会死锁,如果未链接 pthreads 则不会死锁。

这是因为默认实现std::mutex::lock does nothing.

编译器是否知道链接的库?

否:编译器只是调用std::mutex::lock并传递给它的地址mtx。这是执行该函数的行为不同。

Update:

澄清一下,实现是否能够根据库是否已链接来改变自身?通过宏?

当编译器完成编译时,宏预处理是also已完成并且不能产生任何进一步的影响。

也许最好的办法就是展示一下。假设您有:

int main() { return foo(); }

你能看出上面程序的执行结果是什么吗?不,你不能,因为你不知道什么foo does.

现在假设我编译以下内容:

// foo.c
int foo() { return 0; }

gcc -c foo.c && ar ruv libfoo.a foo.o
gcc main.o -L. -lfoo

现在你可以知道程序将退出0返回代码。

现在假设我还编译了以下内容:

// bar.c
int foo() { abort(); }

gcc -c bar.c && ar ruv libbar.a bar.o

最后,我链接相同未修改的 main.o像这样:

gcc main.o -L. -lbar -lfoo

你能说出最终的程序会做什么吗?

你可以:它会死SIGABRT并产生核心转储。

请注意main.o没有改变,只有图书馆main.o正在链接的对象已更改。

这与导致原始程序根据是否链接而表现不同的机制完全相同。libpthread.

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

除非链接到 pthreads,否则不会出现死锁? 的相关文章

  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone

随机推荐

  • Android fill_parent 到 match_parent

    引入 match parent 和弃用 fill parent 背后的原因是什么 因为两者含义相同 此更改不会妨碍向后兼容性吗 使用 match parent 而不是 fill parent 不会使生成的 APK 在旧版本中无法运行 因为在
  • gwt 谷歌应用引擎 HTTP 错误 404

    我在 Eclipse 中使用 google 应用程序引擎创建了一个新的 gwt 项目 但是当我运行该项目时 在浏览器中我收到以下消息 HTTP 错误 404 访问 Test html 时出现问题 原因 NOT FOUND 由码头提供动力 现
  • 多维数组(如 C/C++ 中的数组)是不规则数组的特殊情况吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我和一个哥们讨论了C 和C多维数组是否是不规则数组的特例 一种观点是 多维数组不是参差不齐的数组 因为多维数组的每个元素具有相同的大小 在参差不齐的数
  • IE11 中的 JavaScript 给我脚本错误 1003

    我有一个带有手风琴和一些 javascript 的网站 在 Firefox 中一切正常 但在 IE11 中出现错误 SCRIPT1003 应为 我将其范围缩小到 js 文件中的这段代码 var nmArray new Array funct
  • 如何(如果可能)更改 eclipse(月出主题)中突出显示的搜索结果的颜色选项?

    我已将 Eclipse Kepler SR2 主题更改为 Moonrise 0 8 9 现在 突出显示对象的颜色使结果几乎不可见 我没有找到任何选项来修改文本颜色或背景颜色 我已附加搜索视图 要更改突出显示的行搜索结果 请转到 Window
  • 如何在节点红色中进行http重定向?

    我需要重定向到另一个网址 我正在使用nodered请求一个url 然后获取用户名和密码 在cloudant数据库中检查它们 在发现它们存在之后 我需要重定向到另一个 home 是否有一个节点可以重定向 我尝试使用 http 请求节点 但它只
  • 如何使用 Apache HttpClient 4 获取文件上传的进度条?

    我有以下用于使用 Apache 的 HTTP Client org apache http client 上传文件的代码 public static void main String args throws Exception String
  • 具有水平和垂直组合布局的可折叠树

    我正在尝试在 D3 中创建一个可折叠树 它结合了水平 第一级和第二级 和垂直 3 级 布局 这里有一个jsfiddle http jsfiddle net artemkolotilkin z7tb23Lo 到目前为止我所得到的 除了一件事之
  • 带列的树视图

    我需要为我正在编写的应用程序提供一个多列树视图 我想知道是否有人知道免费工作 在 Vs 2010 中 多列树视图 网络上可以找到许多示例控件 Net 的 TreeViewAdv http sourceforge net projects t
  • Intellij Idea 使用什么 JVM 来启动?

    我是 Eclipse 用户 最近决定尝试 Intellij Idea 我的操作系统是 Ubuntu 12 使用 Eclipse 时 可以通过在 eclipse ini 中指定来轻松选择用于启动 Eclipse 的 JVM http wiki
  • Flutter - LinearGradient 的平滑过渡颜色

    Hellow 是否有解决方案可以创建在起始颜色和结束颜色之间平滑过渡的 LinearGradient new Container decoration new BoxDecoration gradient new LinearGradien
  • C# DLL 运行时错误 - 构建、运行,但在尝试使用 DLL 函数时抛出未处理的异常

    我正在尝试编译所示的示例项目here http www ftdichip com Support SoftwareExamples FTDIChip ID htm对于 C 它必须转换为 VS2010 但效果很好 它会构建 运行 但当它尝试访
  • 在来电期间更改呼叫者的号码

    首先我找到了一种方法 可以在拨出电话时修改被叫号码 我在来电期间尝试对呼叫者的号码进行相同的操作 但我唯一能做的就是读取呼叫者的号码 而不是更改它 有人可以给我提示吗 到目前为止我收到的代码 Bundle b intent getExtra
  • 可以从自定义 LoginModule 访问远程 EJB 吗?

    我发现了一些关于如何编写自定义领域和登录模块的好提示 我想知道是否可以在自定义登录模块中访问远程 EJB 就我而言 我有远程 EJB 提供对用户实体的访问 通过 JPA 我可以使用它们吗 例如通过 EJB 注释 好吧 我自己找到了答案 工作
  • 原始 ssh 连接(低级)

    作为一个小型 大型 业余爱好项目 我开始用 C 制作一个 非常原始的 ssh 2 0 客户端 这是为了探索和更好地理解 DH 并帮助加深我对加密的熟悉程度 根据 RFC 4253 我已经开始这样的初始连接 省略不相关的变量预设等 Rando
  • 捕获的图像总是显示横向并且无法解决setRotate

    这里有很多类似的主题和问题 我关注this https stackoverflow com a 12933632 5257704 但我收到错误 My Code Override protected void onActivityResult
  • 文档 - 如何通过名称获取标签的值?

    我正在使用 Java 的 DOM 解析器来解析 XML 文件 假设我有以下 XML
  • 除了“真实”对象之外,DDD 存储库还可以使用摘要对象吗?

    假设我正在创建一个存储库来存储数字电子书 如下面的界面所示 该存储库将存储书籍的实际文本以及标识书籍的元数据 标题 作者 出版商 ISBN 等 public interface IBookRepository void AddBook Bo
  • MongoDB聚合查询性能提升

    我最近开始将数据从 Microsoft SQL Server 转移到 MongoDB 以获得可扩展性 就移民而言一切都很好 该文档有 2 个重要字段 customer timestamphash 年月日 我们在安装 MongoDB 的 Az
  • 除非链接到 pthreads,否则不会出现死锁?

    为什么创建 std mutex 死锁实际上不会导致死锁 除非程序链接到 pthreads 以下内容在与 pthreads 库链接时会死锁 如果未链接 pthreads 则不会死锁 在 gcc 和 clang 上测试 clang main c