- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
最近,GNU C 库使用 DWARF2 展开用于 pthread 取消,因此 C++ 异常和 pthread 取消清理处理程序都通过公共(public)调用框架展开过程调用,该过程在必要时调用自动对象的析构函数。然而,据我所知,仍然没有指定 (POSIX) 线程和 C++ 之间交互的标准,并且可能希望可移植的应用程序应该假设从取消清理上下文中抛出异常与调用 longjmp
,并且取消具有非平凡析构函数的实时自动对象的线程也是未定义的行为。
是否有任何正在进行的标准化流程来处理这种交互,或者它是否可以预期在未来很长一段时间内未定义? C++11 在其线程支持中是否有任何类似于 POSIX 线程取消的概念?
最佳答案
作为包含 WG14 (C)、WG15 (POSIX) 和 WG21 (C++) 的 ISO/IEC SC22 的成员,我可以告诉您快速的答案是否定的,C++ 异常和线程取消不会出现很快就会彼此。 C11 和 C++11 没有提到线程取消,并且在大约十年后的下一个主要标准发布之前,即使不是极不可能,也极不可能认识到它。
较长的答案归结为标准的运作方式。基本上ISO只能规范大家能达成一致的东西,而线程取消的时候大家是不同意的。执行线程必须在每个可取消的系统调用之前转储状态的整个想法违背了现代软件开发的整体精神。它给编译器优化带来了巨大的问题,因为与 C++ 异常抛出不同,线程取消被定义为与调用 thread_terminate(self) 相同,这明确排除了做任何额外的事情(甚至取消处理程序在许多实现中都不能可靠地调用),并且我不认为线程取消支持者会不同意这是一个糟糕的解决方案。
问题是唯一合适的选择是重新发布带有异步完成变体的 POSIX i/o API。问题在于不同的 POSIX 实现对异步完成的看法非常不同。我的意思是,我们甚至无法就内核等待队列的标准达成一致,因此在实现该标准之前,异步 i/o API 还有很长的路要走。我有一个关于为下一个标准 TC/TR 对内核等待队列进行一些移动的提议,但提议的对象故意非常简单。
我们在 C11/C++11 中尝试做的是让线程 API 始终具有非阻塞版本——其中只有一个 API 不能以非阻塞方式完成,即 thread_join( )(没有 thread_timedjoin()),我计划在获得 Austin 工作组批准后亲自提交勘误表。在所有其他情况下,人们总是可以构建一些东西,它可以轮询效率不高但程序正确的东西。
从长远来看,就我个人而言,我认为有充分的理由按照与 C++ 相似的语义向 C 添加异常处理。你不一定有对象支持(我实际上个人也支持将非虚拟对象添加到 C),但你会有堆栈展开的 lambda 函数调用的概念。这将使我们能够通过适当定义的机制将诸如线程取消之类的黑客行为形式化。它还让您像编写风一样编写展开,并让旧 C 与新 C 透明地互操作,从而使编写容错 C 变得更加容易和安全。
关于从异常处理中抛出异常,我个人认为我们需要做一些比总是自动调用 terminate() 更好的事情。由于展开可能导致新对象的构造,或者实际上任何其他异常抛出源,我个人非常希望在终止进程之前尽一切合理尝试展开整个堆栈。
因此,简而言之,预计 POSIX 线程取消将继续被视为未定义,并且从长远来看,很有可能它会被弃用,取而代之的是更好的东西。
顺便说一句,通常 POSIX 线程取消在实现之间是高度不可移植的,因此任何使用 POSIX 线程取消的代码实际上都依赖于特定于平台的行为,这与使用非 POSIX API 相同。如果您希望代码可移植,请不要使用 POSIX 线程取消。而是使用 select() 或 poll() 包括一个神奇的“请立即停止线程”文件描述符。在我自己的 C++ 代码中,我实际上有一个系统 API 包装器宏,它测试这个神奇的文件描述符并抛出一个特殊的 C++ 异常。这确保了在所有平台(包括 Windows)上的行为相同。
关于c++ - 在指定 C++ 异常和 pthread 取消的交互方面有什么进展吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9440077/
我正在将一些 pthreads 代码添加到我使用 autotools 构建的 Linux 应用程序中。我收到关于未在 libpthreads 中链接的错误。所以我想在 autotools 中指定 pt
libpthread 库位于 Linux 系统的哪个目录中? 最佳答案 有多种方法可以找出这一点。 只需输入 find / -name 'libpthread.so' -print找到名为 libpt
pthread 属性对象是否需要在使用它们的对象的生命周期内存在,或者在使用它们后立即销毁它们是否安全?例如: // Create the mutex attributes. pthread_mute
到目前为止我读过的所有文档似乎都表明我的 vxWorks (6.8) 版本中存在 posix 线程支持,但是一个简单的测试应用程序无法按预期执行。来源如下: tTest.h #include cla
我试图找到指定 pthreads 标准的文档。我见过各种指向 IEEE 1003.1c-1995 的链接(即 Wikipedia 或 OpenGroup )。然而,当我在 IEEE 标准站点上搜索此文
我试图找到指定 pthreads 标准的文档。我见过各种指向 IEEE 1003.1c-1995 的链接(即 Wikipedia 或 OpenGroup )。然而,当我在 IEEE 标准站点上搜索此文
我在 MSVC 2010 上运行一个 pthread,我已经包含 pthreadVC2 .lib & .dll。来自以下网站 http://sourceware.org/pthreads-win32/
我的问题是: 如何在不更改其他 pthread 中的当前目录的情况下更改 pthread 中的当前目录,我找到了一个使用 openat() 函数的解决方案,但我没有找到任何解释它如何工作的示例。 使用
是否可以通过任何方式更改进程可以创建的 pthread 数量限制? 目前在我的 linux 系统上我可以创建大约 380 个线程,但我想增加它,只要内存可用。 最佳答案 减少用户的堆栈大小' ulim
问候。我正在尝试创建一个 autoconf 配置脚本,该脚本自动检查要使用的 pthread 选项,并且理想情况下,在使用 gcc 编译时指定 -pthread。 我希望 AX_PTHREAD 能够工
如何知道 pthread 是否死亡? 有办法检查 pthread 状态吗? 最佳答案 if(pthread_kill(the_thread, 0) == 0) { /* still runni
我正在从一个由互斥锁控制的固定大小的全局池中分配我的 pthread 线程特定数据。 (有问题的代码不允许动态分配内存;它允许使用的所有内存都由调用者作为单个缓冲区提供。pthreads 可能会分配内
在阅读了一些 MPI 规范后,我了解到,当使用 MPI_THREAD_SERIALIZED 进行初始化时,程序必须确保发生在不同线程中的 MPI_Send/Recv 调用不能重叠。换句话说,您需要一个
我尝试根据 this guide 安装 pthread win32 . 我将 pthreadVC2.dll 文件添加到 C:\Windows 并将 pthreadVC2.lib 文件添加到 C:\Pr
我有一个 pthreads 程序。我必须使用 Linux 中的 gcc -pthread(-pthreads 是无法识别的选项)和 Sun 中的 gcc -pthreads(-pthread 是无法识
我有一个包含文件名列表的文件,我想在其中搜索一个词并替换它我稍微修改了代码只是为了在这里只显示相关部分问题是如果我在该列表中只有一个文件,它不会用多线程处理它,因为线程只有在我有多个文件时才工作所以我
我正在编写一个 SMT 程序,并且正在尝试解决一个有趣的问题。 我需要所有函数一起退出,但是有些线程卡在障碍物上,即使我不希望它们这样做。 我的问题是:当我删除障碍时会发生什么?卡在屏障处的线程会释放
我阅读了有关 pthread 及其相关 API 的所有内容,以创建、锁定和同步不同的线程。但我经常发现线程池、消费者/生产者等词提示。我理解这些是 pthread 实现的模型。 任何人都可以让我知道
我在 man pthread_join 中读到,多个 pthread 不能加入一个已经加入的 pthread。还有另一种方法可以达到相同的结果吗?多个 pthread 挂起自己,直到某个特定的 pth
我知道 OpenMP 实际上只是一组编译成 pthread 的宏。有没有办法在编译的其余部分发生之前查看 pthread 代码?我正在使用 GCC 进行编译。 最佳答案 首先,OpenMP 不是一组简
我是一名优秀的程序员,十分优秀!