对于那些从未使用多个线程编写应用程序但计划将来这样做的人,本文将很有用。
在Windows操作系统中,TerminateThread在成功终止的情况下返回TRUE。从这个逻辑开始,让我们尝试在 Linux 中组织类似的功能。
首先,我们将检查线程是否处于活动状态。为此,我们将发送一个零信号。如果进程中存在线程并且正在执行,则tkill将返回 0。之后,我们将使用PTHREAD_CANCEL_ASYNCHRONOUS参数调用 pthread_setcanceltype 函数,只有在此之后,我们才会尝试通过调用 pthread_cancel 函数来终止线程。有一种可能的情况是线程仍将执行一段时间,为此我们将使用定时等待函数pthread_timedjoin_np(示例中有五次尝试;每次需要 1000 毫秒)。线程终止后,我们将使用PTHREAD_CANCEL_DEFERRED参数再次调用pthread_setcanceltype。如果有任何错误,将始终返回 FALSE。
进程的任何线程都调用 ExitProcess 函数。
如果其中一个线程调用退出函数(对于 Linux 操作系统),或者ExitProcess 或 TerminateProcess(对于 Windows 操作系统),那么整个过程将被终止。同样,如果线程收到操作包含在进程终止中的信号,则该信号将终止整个进程。
让我们总结一下这一切。正确设计的应用程序不应调用强制线程终止函数。推荐的方法是线程函数返回时。如果 Linux 操作系统中的线程终止,联接将释放进程拥有的链接和系统资源。必须适当考虑到调用两次联接函数是不正确的事实(最好会出现错误)。如果 Windows 操作系统的线程被强制终止,请务必注意,应以任何方式清理所有非系统资源。在Linux中,有pthread_cleanup_push和pthread_cleanup_pop函数。
螺纹端接功能记录在表 5 中。
表 5.线程终止函数。
结论
为了减轻中断的影响,OS 提供了一个由并行运行的进程组成的模型。但是,此模型有其与交互、自己的地址空间的可用性等相关的弱点。
另一方面,应用程序在一个进程中具有多个控制线程可能是有利的。由于这些线程属于同一进程,因此它们使用自己的堆栈上的共享地址空间。
线程可以使用信号量、消息等基元相互交互。这些原语是必要的,以使在关键部分中无法同时执行两个或多个线程。线程可以处于以下状态之一:可运行或执行受阻。一个线程还可以使用交互基元与另一个线程交互。请记住,在使用交互原语时,应谨慎行事以避免错误和死锁。
在本文中,我们分析了Windows和Linux操作系统的流式处理API;呈现基于事件的线程创建和同步接口;讨论了使用共享资源的函数;以及详细的线程终止方式。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !