std::thread 创建抛出异常

2023-11-27

Code:

#include <iostream>
#include <thread>

void hello()
{
    std::cout << "Hello World" << std::endl;
}

int main()
{
    try
    {
        std::cout << "creating thread" << std::endl;
        std::thread t(hello);
        std::cout << "waiting" << std::endl;
        t.join();
        std::cout << "done" << std::endl;
    }
    catch(std::exception& ex)
    {
        std::cout << ex.what() << std::endl;
    }
}

Build:

g++ -Wall -fexceptions -std=c++0x -pthread  -g     -c /home/alex/tmp/thread_test/main.cpp -o obj/Debug/main.o
g++  -o bin/Debug/thread_test obj/Debug/main.o    
Output size is 106.62 KB
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 0 warnings

Result:

创建线程
不允许操作

如何解决这个问题?

Edit:
使用 strace 运行程序:

alex@alex-64:~/tmp/thread_test/bin/Debug$ strace ./thread_test
execve("./thread_test", ["./thread_test"], [/* 38 vars */]) = 0
brk(0)                                  = 0x189a000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7c60cbc000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=121299, ...}) = 0
mmap(NULL, 121299, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f7c60c9e000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64-linux-gnu/libstdc++.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\244\5\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=991424, ...}) = 0
mmap(NULL, 3171440, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f7c60797000
mprotect(0x7f7c6087f000, 2097152, PROT_NONE) = 0
mmap(0x7f7c60a7f000, 40960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe8000) = 0x7f7c60a7f000
mmap(0x7f7c60a89000, 83056, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f7c60a89000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libgcc_s.so.1", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260(\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=88384, ...}) = 0
mmap(NULL, 2184216, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f7c60581000
mprotect(0x7f7c60596000, 2093056, PROT_NONE) = 0
mmap(0x7f7c60795000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14000) = 0x7f7c60795000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \24\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1685816, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7c60c9d000
mmap(NULL, 3801960, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f7c601e0000
mprotect(0x7f7c60377000, 2093056, PROT_NONE) = 0
mmap(0x7f7c60576000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x196000) = 0x7f7c60576000
mmap(0x7f7c6057b000, 21352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f7c6057b000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libm.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360>\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=538928, ...}) = 0
mmap(NULL, 2633960, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f7c5ff5c000
mprotect(0x7f7c5ffdf000, 2093056, PROT_NONE) = 0
mmap(0x7f7c601de000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x82000) = 0x7f7c601de000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7c60c9c000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7c60c9a000
arch_prctl(ARCH_SET_FS, 0x7f7c60c9a740) = 0
mprotect(0x7f7c601de000, 4096, PROT_READ) = 0
mprotect(0x7f7c60576000, 16384, PROT_READ) = 0
mprotect(0x7f7c60795000, 4096, PROT_READ) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7c60c99000
mprotect(0x7f7c60a7f000, 32768, PROT_READ) = 0
mprotect(0x603000, 4096, PROT_READ)     = 0
mprotect(0x7f7c60cbe000, 4096, PROT_READ) = 0
munmap(0x7f7c60c9e000, 121299)          = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7c60cbb000
write(1, "creating thread\n", 16creating thread
)       = 16
brk(0)                                  = 0x189a000
brk(0x18bb000)                          = 0x18bb000
write(1, "Operation not permitted\n", 24Operation not permitted
) = 24
exit_group(0)                           = ?

您的问题是您忘记指定-lpthread or -pthread给编译器的标志。因此,在构建程序时它假定采用单线程模式。

标准 C++ 库抛出异常:

(gdb) catch throw
Function "__cxa_throw" not defined.
Catchpoint 1 (throw)
(gdb) run
Starting program: /tmp/test 
creating thread
Catchpoint 1 (exception thrown), 0x00007ffff7b8eff0 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
(gdb) where
#0  0x00007ffff7b8eff0 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#1  0x00007ffff7b3ba3e in std::__throw_system_error(int) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#2  0x00007ffff7b45cb7 in std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00000000004012d4 in std::thread::thread<void (&)()>(void (&&&)()) ()
#4  0x0000000000400f0e in main ()
(gdb)  quit

我不想为此检查源代码,但他们很可能使用“惰性”动态链接来确定 POSIX 线程系列函数是否可用。否则抛出异常。这样,除非与 pthread 库链接,否则您会得到该异常。

这与虚拟内存或其他资源限制无关,正如我最初认为可能发生的那样,因为系统调用不会报告任何错误。所以就这样做:

g++ -std=c++0x -o test ./test.cpp -pthread

...它会起作用的。

UPDATE:

正如@ildjaRN 指出的,您已经指定了 -pthread。我建议您在目标文件(单次调用编译和链接的源文件)之后指定它,否则可能无法获取它。

这是确保它被拾取的方法 - 你可以运行ldd并确保 pthread.so 进入:

$ g++ -std=c++0x -lpthread -o test ./test.cpp
$ ldd ./test | grep pthread
$ g++ -std=c++0x -o test ./test.cpp -lpthread
$ ldd ./test | grep pthread
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff2a9073000)
$ 

希望能帮助到你。祝你好运!

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

std::thread 创建抛出异常 的相关文章

  • 以编程方式更改 Excel 中的字体(Trebuchet MS、Calibari)C#

    我目前正在使用一个 C 应用程序 该应用程序有一个将生成 Excel 文件的类 一切都很顺利 Excel 工作表上填充的数据具有 Times New Roman 字体 我想将其更改为其他字体 Calibari 我怎样才能以编程方式做到这一点
  • 如何将 CroppedBitmap 转换为 BitmapImage

    我正在尝试将 CroppedBitmap 转换为 BitmapImage 编辑 不使用内存流 我尝试过直接转换它 似乎这不是一个选择 这应该没那么难 我正在尝试剪切 BitmapImage 的一部分 并创建一个仅包含新裁剪的 Bitmap
  • C# Visual Studio 动态代码片段

    我正在开发一个 WinForms 项目 每天都会执行一些重复性的任务 所以我认为创建代码片段 https msdn microsoft com en us library ms165394 v vs 110 aspx会帮助我 但它仅适用于固
  • 用 C# 中的字典中的值替换字符串中的单词

    我有一个简单的dictionary像这样 var fruitDictionary new Dictionary
  • 在 C/C++ 中绘制填充椭圆的简单算法

    在SO上 找到了以下绘制实心圆的简单算法 for int y radius y lt radius y for int x radius x lt radius x if x x y y lt radius radius setpixel
  • java应用程序,线程在终止MySQL连接后挂起

    我有一些工作线程正在运行 其中包括 MySQL 和 mysql connector java 5 1 20 当我杀死一些 SQL 语句 使用 mysql 客户端的kill 连接id 时 java线程挂起 这应该抛出一些异常 jstack 打
  • ObjectTrackingEnabled 和 linq-to-sql

    I read here http www sidarok com web blog content 2008 05 02 10 tips to improve your linq to sql application performance
  • MVVM 同步集合

    是否有一种标准化方法可以将 Model 对象集合与 C 和 WPF 中匹配的 ModelView 对象集合同步 我正在寻找某种类 可以使以下两个集合保持同步 假设我只有几个苹果 并且可以将它们全部保存在内存中 换句话说 我想确保如果我将 A
  • 命令中带空格的 Windows C 系统调用

    我无法使用名称和参数中的空格进行系统调用 例如 system c program files something example exe c my files example txt 我尝试过各种我知道的方法来逃避 但没有任何效果 我努力了
  • 如果 .txt 文件不存在,则创建一个,如果存在则追加新行

    我想创建一个 txt 文件并写入它 如果该文件已经存在 我只想添加更多行 string path E AppServ Example txt if File Exists path File Create path TextWriter t
  • 第三方引用的 dll 未被复制来构建

    我有一个第三方 net dll 被我的 dll 类库项目 A 引用和使用 我的控制台应用程序项目 B 引用项目 A 我的问题是第三方 dll 没有被复制到控制台应用程序项目 B 的构建中 这里有什么问题呢 我的 dll 类库中引用的第三方
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • 除法时的小数舍入误差 (C#)

    我基本上有四个数字 比如 100 200 300 400 我需要计算概率为 100 100 200 300 400 200 100 200 300 400 等等在 当我使用小数数据类型来存储这些概率时 由于舍入问题 它们不会达到 1 在不使
  • 是否有理由为什么用 XmlInclude 修饰的基类在序列化时仍然会抛出类型未知的异常?

    我将简化代码以节省空间 但所提供的内容确实说明了核心问题 我有一个类 它的属性是基类型 有 3 个派生类可以分配给该属性 如果我将任何派生类分配给容器并尝试序列化容器 XmlSerializer 会抛出可怕的错误 类型 x 不是预期的 使用
  • 实体框架中的导航属性是什么

    我是实体框架的新手 当Visual Studio创建模型图时我们主要可以看到Entities Propertie和Navigation Properties这两个东西 那么这些Navigation Properties是什么 如何使用它们
  • 如何通过 Excel 互操作对象自动调整列大小?

    下面是我用来将数据加载到 Excel 工作表中的代码 但我希望在加载数据后自动调整列的大小 有谁知道自动调整列大小的最佳方法 using Microsoft Office Interop public class ExportReport
  • 没有类型的 IEnumerable 属性

    我正在尝试创建一个类似于来自 MSDN 的官方 DataGrid ItemsSource 的属性 public IEnumerable ItemsSource get set 这提供了对任何派生类中任何类型的支持 有了这个 我可以设置类似的
  • Subsonic 3 ActiveRecord 嵌套选择导致 NotIn 错误?

    我有以下 Subsonic 3 0 查询 其中包含嵌套的 NotIn 查询 public List
  • 在 C# 中为 ListBox 分配数据源时,如何从 ListBox 中删除所选项目?

    在 C 中为 ListBox 分配数据源时 如何从 ListBox 中删除所选项目 尝试删除时出现错误 设置 DataSource 属性后 无法修改项目集合 但是当我尝试从数据源 数据表 中删除项目时 它会抛出错误 因为 数据行不在当前行集
  • 64 位随机生成器种子

    我目前正在运行一个具有 8 个以上管道 线程 的多线程模拟应用程序 这些管道运行非常复杂的代码 该代码取决于种子生成的随机序列 然后该序列被归结为单个 0 1 我希望在将种子从主线程传递到处理管道后 这种 随机处理 具有 100 的确定性

随机推荐

  • 有没有比忙等待更智能的方法来检查 System.Net.WebClient.DownloadFileAsync() 的下载完成情况?

    我正在使用 System Net WebClient DownloadFileAsync 下载文件 使用异步版本的唯一原因是显示下载进度 在达到 100 之前 我的代码执行可能不会继续 目前我正在使用忙等待 参见代码 但我想知道是否有更聪明
  • fgetpos() 行为取决于换行符

    考虑这两个文件 file1 txt Windows 换行符 abc r n def r n file2 txt Unix 换行符 abc n def n 我注意到对于 file2 txt 通过以下方式获得的位置fgetpos没有正确增加 我
  • 可移动/可拖动

    这是我更新和修改的脚本 它完全可以工作 除了我想通用它 观察 我怎样才能做到这一点 这样我就不必这样做function e BOX Draggable elemen e target e srcElement elementDraggabl
  • Jenkins:在 MultiJob 中共享变量

    我使用 Jenkins 进行测试 构建 因此我使用以下配置创建了一个 MultiJob 项目 Test Job 建立工作 安装工作 MultiJob 从 Master Jenkins 启动 但其他作业从其他 Node 启动 构建作业执行创建
  • DVCLAL 的所有可能值的列表是什么?

    当我遇到这个函数时 我正在阅读 SysUtils function ALR Pointer var LibModule PLibModule begin if MainInstance lt gt 0 then Result Pointer
  • sql触发器打印消息

    我是在数据库中使用触发器的新手 我创建了一些对我来说非常有效的触发器 除了当我尝试创建一个在删除行后显示一条消息的触发器时 我尝试使用这段代码 ALTER TRIGGER mycustomerTrigger AFTER delete ON
  • 如何在 git 中查看传入的提交? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 Git 如何在本地和远程之间查找修改过的文件 如何在 git 中查看传入的提交 或者甚至更好 看看我刚刚说的git fetch git pulled Edit 为了澄清这个问题 有人告诉我 为了
  • 为什么 JVM 不缓存 JIT 编译的代码?

    Sun 的规范 JVM 实现对字节码应用了一些相当复杂的优化 以便在代码运行几次后获得接近本机的执行速度 问题是 为什么不将此编译后的代码缓存到磁盘以供后续使用同一函数 类时使用 按照目前的情况 每次执行程序时 JIT 编译器都会重新启动
  • 用于图像去模糊的维纳滤波器

    我正在尝试实现维纳滤波器来对模糊图像执行反卷积 我的实现是这样的 import numpy as np from numpy fft import fft2 ifft2 def wiener filter img kernel K 10 d
  • 使用 JfreeChart 动态向 XYSeries 添加点

    我在向 XYSeries 添加点时遇到问题 我有两节课 一是Sample 它有一个main方法 另一个类是JfreeChart 它有JfreeChart代码 在我的Sample类我有一个二维数组sample row 2 最初有 10 行 然
  • 如何检查 double 是否最多有 n 位小数?

    目前我有这个方法 static boolean checkDecimalPlaces double d int decimalPlaces if d 0 return true double multiplier Math pow 10 d
  • android 出现所有包无法下载的错误

    所有软件包均不提供下载 以下软件包不可用 包 ID 来源 android 24 我尝试使用 Web 服务从数据库获取数据 但运行应用程序时出现上述错误 如何在 android studio 中解决这个问题 弹出错误与您在应用程序中遇到的异常
  • 在C中获取LAN上的设备列表

    我想获取连接到我的本地网络的可用设备列表 它们的 IP 地址或主机名应该没问题 我有一些 C 示例 但找不到任何使用 C C 的示例 我熟悉 BSD 套接字 API 只是为了澄清一下 我有一个 存根 的想法 也许我应该确定 LAN 上的设备
  • 为什么不能将镜头类型更改为使用任何 Integral?

    take Int gt a gt a genericTake Integral i gt i gt a gt a 我读过不方便的类型take这是由于历史原因 更改它可能会导致某些代码损坏 但我不能更换吗take with genericTa
  • 梯度下降代码的向量化

    我正在 Matlab 上实现批量梯度下降 我的更新步骤有问题theta theta是两个分量 两行 的向量 X是一个矩阵 包含m行 训练样本数 和n 2列 特征数量 Y 是一个m行向量 在更新步骤中 我需要设置每个theta i to th
  • 在C++程序中使用mat文件

    请 谁能帮我 我有 Mat 文件包含特征向量数组结构 我需要在 C 程序中使用此文件 如何在我的 C 程序中加载该文件 你可以尝试matio图书馆 它至少支持版本 5 的 mat 文件 我认为是压缩和结构 也许还有更新的东西 看来正在积极开
  • 打包 Streamlit 应用程序并在 Windows 上运行可执行文件

    这是我在 Stackoverflow 上的第一个问题 我希望我的问题很清楚 否则请告诉我 并随时向我询问更多详细信息 我正在尝试为个人项目打包一个 Streamlit 应用程序 我正在 Linux 下开发 但我必须在 Windows 上部署
  • Kivy CheckBox 看起来像实心黑盒子(不是复选框)

    我正在制作一个 BoxLayout 小部件 方向 水平 其中包含三个小部件 一个标签 一个文本框和一个复选框 thisRow BoxLayout orientation horizontal l Label text Enter plate
  • WorkbenchJ - 错误:GROUP BY 子句中不允许聚合

    我在网站上发现了一些其他带有此错误消息的线程 但那里的解决方案似乎对我不起作用 这是我试图运行的查询 SELECT o name as Name o vrank tav c as Vrank COUNT c enterprise id AS
  • std::thread 创建抛出异常

    Code include