Windows和Linux操作系统的流式处理API

描述

对于那些从未使用多个线程编写应用程序但计划将来这样做的人,本文将很有用。

在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 中。

Linux

表 5.线程终止函数。

结论

为了减轻中断的影响,OS 提供了一个由并行运行的进程组成的模型。但是,此模型有其与交互、自己的地址空间的可用性等相关的弱点。

另一方面,应用程序在一个进程中具有多个控制线程可能是有利的。由于这些线程属于同一进程,因此它们使用自己的堆栈上的共享地址空间。

线程可以使用信号量、消息等基元相互交互。这些原语是必要的,以使在关键部分中无法同时执行两个或多个线程。线程可以处于以下状态之一:可运行或执行受阻。一个线程还可以使用交互基元与另一个线程交互。请记住,在使用交互原语时,应谨慎行事以避免错误和死锁。

在本文中,我们分析了Windows和Linux操作系统的流式处理API;呈现基于事件的线程创建和同步接口;讨论了使用共享资源的函数;以及详细的线程终止方式。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分