上一个帖子
聊完了Win32环境下和线程有关的C++对象死亡问题,今天得说一说POSIX的线程库pthread了。如果你对pthread不太了解,可以先看看维基百科
的介绍。<!-- program-think-->
★三种死法
废话少说,照例先介绍三种死法。
1、自然死亡
上一个帖子
已经介绍了Win32线程的自然死亡,pthread的自然死亡和它差不多,也是线程对应的线程函数通过return返回。
2、自杀
对于“自杀”,POSIX使用pthread_exit
函数来实现。就一种方式,相比Win32的自杀简单多了,此处省去不少口水。
3、它杀
虽然pthread的自杀简单,但是它杀就比较复杂了。所以,我把口水转移到这里,重点说一下它杀的方式。
在pthread库中主要使用pthread_cancel
杀线程。用pthread_cancel
取消线程还分两种情况:异步取消
(PTHREAD_CANCEL_ASYNCHRONOUS)和延迟取消
(PTHREAD_CANCEL_DEFERRED)。
异步取消是相当粗暴的,不管三七二十一,直接把线程干掉;而延迟取消则比较温柔,被取消的线程会继续运行直到遇见某个“取消点”才终止。由于本帖不是
pthread的入门扫盲帖,关于什么是“取消点”以及线程取消的其它细节,请参考pthread API手册。
有同学可能会问了,pthread_kill
难道不是用来“它杀”的?其实pthread_kill
只不过是给指定的线程发送信号(signal)而已。哎,当初也不知道是哪个家伙起了pthread_kill
这个函数名,误导了不少同学。另外,使用pthread_kill
有一点要小心,如果对应的线程没有处理
收到的信号,则该信号可能会影响线程所在的进程
,可能会导致进程终止(相当于进程自杀)。
★类对象的析构
上一个帖子
已经分析过,和线程有关的C++对象,也就是两种局部对象。请看这两种对象在不同死法上,是否会正常析构。
-------------------------
局部非静态对象 局部静态对象
自然死亡 能 能
自杀 不一定能 能
它杀(延迟) 不一定能 能
它杀(异步) 不能 能
-------------------------
对于上述对照表中的“不一定能”,在Linux平台(具体是RHEL3,GCC 3.2.3)下能够析构,但是在Cygwin(具体是Windows2003,GCC 3.4.4)中不能,所以只好认为是“不一定能析构”。
由于pthread在不同的操作系统上的实现可能有差异,说不定在某些环境下,自杀和它杀的表现会和上述不一致。假如你发现自己碰到的实际情况和上述不符合,欢迎你通过评论或邮件告诉我,我会补充到本文中 :-)
从上表来看,异步它杀是最不安全的,自然死亡还是最安全的。至于自杀和延迟它杀,则要看具体的环境了。
★关于主线程之死
关于啥是主线程,上一个帖子
已经介绍过了,不再多啰嗦。在POSIX系统里,主线程的自然死亡也会引发exit
被调用,从而导致其它线程被野蛮地干掉(这个情形和Windows系统中类似)。如果希望主线程退出不导致进程自杀,可以使用pthread_exit
来结束主线程,并让其它线程继续运行。不过由于线程自杀在某些环境下也不安全
,我建议还是让主线程最后退出比较稳妥。
POSIX系统中,线程相关的对象析构问题,就聊到这里。
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者编程随想
和本文原始地址:
http://program-think.blogspot.com/2009/03/cxx-object-destroy-with-thread-posix.html
分享到:
相关推荐
本示例主要讲解了如何在NDK中利用C++调用Java方法,并通过POSIX线程库实现多线程的生产者消费者模式。下面将详细阐述相关知识点。 1. **NDK与C++编程** NDK提供了一种在Android应用中集成原生代码的方式,使得...
本书深入浅出地介绍了POSIX线程(也称为pthreads)API,是理解并掌握多线程编程的重要参考资料。在本文中,我们将探讨POSIX线程的基本概念、API用法以及在实际开发中的应用。 1. **POSIX线程基础** - POSIX线程,...
在Unix系统和许多类Unix系统中,POSIX线程(POSIX Threads),通常称为Pthreads,是一种使用线程的编程接口,它允许程序设计者在C和C++这样的编程语言中实现多线程。使用POSIX线程库进行多线程编程,可以让开发者...
POSIX线程,也称为pthreads,是操作系统中的一种线程接口,被广泛应用于包括C++在内的多种编程语言。线程允许程序同时执行多个任务,是并发编程的基础。线程和进程之间的主要区别在于,线程共享同一内存空间,而进程...
本书深入描述了IEEE的开放系统接口标准-POSIX线程,通常称为Pthreads标准。本 书首先解释了线程的基本概念,包括异步编程、线程的生命周期和同步机制;然后讨论了 一些高级话题,包括属性对象、线程私有数据和实时...
### C++多线程编程知识点概述 #### 一、Pthread简介及基本概念 - **Pthread**: POSIX Threads 的简称,是一种跨平台的线程管理API,在多种操作系统中都有实现,包括Linux、macOS等。它遵循POSIX(Portable ...
本话题主要关注的是如何利用POSIX线程库(pthread)和C11标准中的线程库来构建一个能够运行于多种平台的线程池系统。 首先,让我们深入了解POSIX线程库(pthread)。POSIX是Portable Operating System Interface的...
6. 线程优先级:虽然C++标准库未提供直接设置线程优先级的接口,但在某些平台(如POSIX系统)上,可以通过操作系统特定的API来调整线程优先级。 压缩包中的OS2、WIN32、UNIX和LISTINGS文件夹可能分别包含对应操作...
本综合技术篇将深入探讨C++中的多线程概念、实现方法以及常见问题。 一、线程基础 线程是操作系统分配处理器时间的基本单元,每个线程都有自己的程序计数器、寄存器和栈空间,共享同一进程的内存空间。在C++11及...
【C++ 语言】线程安全队列 ( 条件变量 | 线程调度 ) : ...【C++ 语言】Visual Studio 配置 POSIX 线程 ( Windows 不支持 POSIX | 配置文件下载 | 库文件说明 | 配置过程 )
在C++中,多线程的实现通常依赖于平台相关的API,如POSIX线程库(pthread)对于Unix-like系统。本文将深入探讨C++中创建多线程基类的方法,以实现类似于Java中的Thread和Runnable接口的功能。 首先,我们可以看到一...
在C++11之前,多线程支持通常是通过第三方库如POSIX的pthread或者Windows的WinAPI来实现的。C++11首次将多线程支持纳入标准库,使得跨平台的多线程编程变得更加方便。核心概念包括`std::thread`、`std::mutex`、`std...
在这个名为"POSIX规范多线程代码示例"的压缩包中,你将找到六个使用C++的POSIX线程库(pthread)编写的示例,它们逐步展示了如何在Linux和Windows环境下(使用Visual Studio,需添加-lpthread链接选项)创建和管理多...
4. POSIX线程(Pthreads):文档中提及了pthread.h,这是一个在POSIX兼容系统(如Linux、Unix)上提供的线程编程接口。C++中实现多线程经常依赖于这个库。从文档内容来看,Thread类的实现可能使用了Pthreads。 5. ...
在C++中实现多线程扫描端口,首先需要理解C++的线程库,如POSIX线程(pthread)或者C++11标准库中的`<thread>`。线程可以并发执行,允许程序同时处理多个任务,提高扫描效率。以下是一些核心知识点: 1. **线程创建...
除此之外,还可以使用POSIX线程库(pthread)或者Windows API中的CreateThread函数来创建线程,但这些是非跨平台的方法。 2. **C++11标准库中的线程创建** - `std::thread`类是C++11引入的线程对象,通过实例化这...
综上所述,这个开源的win32平台C++多线程开发包提供了一个在Windows环境下编写多线程程序的解决方案,它基于C++语言和POSIX线程标准,通过`pthreadVC2.dll`和`pthreads`库实现了跨平台的线程功能。对于希望在Windows...
线程的挂起和恢复在C++标准库中并不直接支持,但可以借助操作系统特定的API,如POSIX的`pthread_suspend`和`pthread_resume`,或者Windows的`SuspendThread`和`ResumeThread`。不过,这种方式通常不推荐,因为容易...
在C++11之前,多线程通常依赖于平台特定的API,如POSIX的`pthread`或Windows的`CreateThread`。现在,C++标准库为我们提供了一种统一且跨平台的方式来处理多线程。 首先,创建一个新的线程需要使用`std::thread`类...
在C++中,多线程可以使用标准库中的`<thread>`和`<mutex>`等头文件来实现,也可以使用Windows API或POSIX API等操作系统级别的API进行开发。 ### 2. 创建线程 C++提供了多种方式来创建线程。在本例中,使用了...