- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想了解 pthread_cancel 在 c++ 中的 linux 环境中的用法。但是我遇到了运行时问题。
class A {
public:
A(){cout<<"constructor\n";}
~A(){cout<<"destructor\n";}
};
void* run(void* data) {
A a;
while(1) {
//sleep(1);
cout<<"while\n";
}
}
int main() {
pthread_t pid;
pthread_create(&pid,NULL,run,NULL);
sleep(2);;
pthread_cancel(pid);
cout<<"Canceled\n";
pthread_exit(0);
}
constructor
while
while
...
while
while
Canceled
FATAL: exception not rethrown
Aborted (core dumped)
(gdb) where
#0 0x00000036e8c30265 in raise () from /lib64/libc.so.6
#1 0x00000036e8c31d10 in abort () from /lib64/libc.so.6
#2 0x00000036e9c0d221 in unwind_cleanup () from /lib64/libpthread.so.0
#3 0x00000036fa69042b in std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) () from /usr/lib64/libstdc++.so.6
#4 0x00000000004009c5 in run(void*) ()
#5 0x00000036e9c0677d in start_thread () from /lib64/libpthread.so.0
#6 0x00000036e8cd49ad in clone () from /lib64/libc.so.6
但是,如果我在线程函数运行中取消对 sleep(1) 的注释,我将得到低于输出的结果。
constructor
while
Canceled
destructor
你能解释一下为什么程序在第一种情况下给出“致命:异常未重新抛出”而不是在第二种情况下吗?并请举例说明为什么 pthread_cancel 比 pthread_kill 更安全?
最佳答案
很抱歉成为坏消息的传递者,但是很难让 pthread_cancel 在 Linux 中的 C++ 中正常工作。
原因是 Linux 中的 pthread_cancel 方法实现非常糟糕。特别是它会导致抛出异常(abi::__forced_unwind
截至我撰写本文时)。这在 C 程序中可能很好,但在 C++ 中,很难正确处理线程取消。特别是如果你有任何代码吃掉异常(例如 catch (...)
),这个内部异常将被处理,而不是按照它需要的方式向上传递堆栈。在这种情况下,您将看到您所看到的错误消息。
就是说,我看不出您的代码中有什么会“吃掉”这个异常,但我怀疑正是这种性质导致了问题。
在您的特定示例中,当您想要退出而不调用 pthread_cancel 时,可以通过使用标志或类似的东西来轻松解决这个问题。不幸的是,这使得 sleep
变得更加复杂(您需要以较小的间隔多次调用它以检查标志)并且几乎不可能调用 accept
(您必须做一个从另一个线程或进程连接到端口以强制 accept
退出,以便您可以检查变量)。一般而言,关于线程取消问题的讨论很长(https://lwn.net/Articles/683118/),但鉴于 macOS(可能还有其他非 Linux“unix”)似乎处理得很好,我真的认为 Linux 实现可以做得更好.但在此之前,pthread_cancel 仍然很难使用。
关于c++ - 致命 : exception not rethrown in c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34972909/
我的电脑正确配置了 SSH,我在尝试克隆存储库时遇到了这个错误: 我运行这个命令来克隆存储库 git clone ssh://git-codecommit.us-west-2.amazonaws.co
我试图下载android源代码。但是遇到了一个问题。 # repo init -u https://android.googlesource.com/platform/manifest fatal:
尝试运行我 4 年前开发的 Rails 4 项目,从那时起我一直在维护,我遇到了下一个错误,该错误在启动时卡住了应用程序: machine stack overflow in critical reg
这个问题在这里已经有了答案: psql: FATAL: role "postgres" does not exist (32 个答案) 关闭上个月。 我正在设置 Postgresql 以与 Rail
我正在创建新分支并尝试推送该分支(我尝试了以下命令): git push --all -u git push origin NewBranch 但在这两种情况下我都会收到此错误: Permission
我尝试克隆这个 repo 几次,但得到了同样的错误。是不是因为它太大而我的连接速度很慢? $ git clone https://git01.codeplex.com/typescript Cloni
我正在尝试使用 http://danielmiessler.com/study/git/#website 设置 git管理我的网站。 我已经到了指令的最后一步:git push website +ma
当我使用快速启动方法安装Eucalyptus云时,我看到安装失败。以后检查日志文件时,遇到以下错误。 最佳答案 错误消息是: Invalid gateway due to subnet/netmask
黄色, 我尝试按照以下步骤设置选项“在没有用户名和密码的情况下访问(推送到)Github”。 https://medium.com/@amanze.ogbonna/accessing-pushing-
我很难用 postgres 设置 django。 这是我的设置.py: DATABASES = { 'default': { 'ENGINE': 'django.db.back
当我尝试从实时实例服务器访问数据库时出现此错误。有谁知道原因吗? 最佳答案 可能是你的硬盘没有可用空间 关于PostgreSQL:致命:XX000:无法写入初始化文件,我们在Stack Overflo
我正在尝试连接到我的 PostgreSQL 服务器,但 psql 提示我没有有效的客户端证书。以下是我创建证书的方式: 自签名服务器证书: openssl req -new -text -nodes
我团队中的其他人创建了一个新的 git 分支,提交并推送到我们使用的常用远程。当我尝试检查这个分支时,我得到了这个: % git checkout 12382 fatal: Cannot switch
我正在尝试让 TravisCI 自动部署我的 Hakyll 静态站点,根据 this guide . 这是我的存储库的设置方式。我有我的源代码分支,其中包含我的 hakyll 和 Markdown 文
尝试提交时 git commit -a -m "Huge update" 我明白了 fatal: could not parse HEAD Error When Committing 看完fatal:
我想在我的 flutter 应用程序上使用 fcm,所以在创建 firebase 控制台并在我的 gradle 中安装了一些依赖项之后,如下所示: build.gradle:项目 dependenci
我是 GIT 的初学者,现在遇到了一个大问题。我在另一台 PC 上提交并推送了一些文件,现在在我的家用 PC 上,git 坏了。 请看下面: $ git status fatal: failed to
我想从 github 上克隆一个项目到我的电脑上 D:\Projects> git clone https://github.com/***/***.git 但是在下载的时候,出现了几个致命的错误:
所以我尝试使用以下命令获取opencv_contrib: $ git clone https://github.com/Itseez/opencv_contrib 这给了我以下错误: fatal: d
这是我在pod文件中使用的行 pod'SDWebImage','〜> 3.8' 以前是 pod'SDWebImage','〜> 3.7' 我尝试了以下 pod安装 pod更新和 pod更新'SDWeb
我是一名优秀的程序员,十分优秀!