侵权投诉

Linux的C编程中多线程如何终止某个线程示例与要点

FPGA之家 2021-04-27 13:41 次阅读

示例 demo

最简单的 demo:

static void* thread1_func(void *arg)

{

int i = 0;

// able to be cancel

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);

pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);

for(i=0; ; i++) {

printf(“thread1 %d

”, i);

sleep(1);

}

}

int main(int argc, char **argv)

{

pthread_t t;

void *res;

pthread_create(&t, NULL, thread1_func, NULL);

sleep(3);

pthread_cancel(t); // cancel thread1

pthread_join(t, &res); // wait thread1

if (res == PTHREAD_CANCELED

printf(“thread1 was terminate by cancel

”);

else

printf(“thread1 was not terminate by cancel

”);

exit(EXIT_SUCCESS);

}

为了突出重点,省略了检查返回值。

运行效果:

thread1 0

thread1 1

thread1 2

thread1 was terminate by cancel

主线程先创建线程 thread1,然后睡眠 3 秒后发出终止 thread1 的请求。

接收到终止请求后,thread1 会在合适的时机被终止掉。

主线程通过 pthread_join() 阻塞等待 thread1 退出。

几个要点

线程终止的 4 种方式:

线程的执行函数返回了,这和 main() 函数结束类似。

线程调用了 pthread_exit() 函数,这和调用 exit() 返回类似。

线程被另一个线程通过 pthread_cancel() 函数取消,这和通过kill() 发送 SIGKILL 信号类似。

进程终止了,则进程中的所有线程也会终止。

取消某个线程的常规步骤

被取消的线程:

允许取消,pthread_setcancelstate(),参数可选值:

PTHREAD_CANCEL_ENABLE,这是默认值;

PTHREAD_CANCEL_DISABLE;

设置取消类型,pthread_setcanceltype(),参数可选值:

PTHREAD_CANCEL_ASYNCHRONOUS,异步方式,当发出取消请求后,线程可能会在任何点被杀死。

PTHREAD_CANCEL_DEFERRED,延迟方式,线程只会在特定的取消点(cancellation points,调用某个函数前)被杀死。

发起取消的线程:

发送取消要求,pthread_cancel(),发出取消请求后,pthread_cancel() 当即返回,不会等待目标线程的退出。

等待取消完成,pthread_join()。

哪些函数是取消点?

POSIX.1 指定了哪些函数一定是取消点:

6db9b9f8-a67e-11eb-aece-12bb97331649.png

更多关于取消点的介绍:

$ man 7 pthreads

Cancellation points

。..

accept()

aio_suspend()

clock_nanosleep()

close()

。..

阅读开源软件 MJPG-streamer

MJPG-streamer 是什么?

简单地说,就是一个开源的流媒体服务器:

https://github.com/jacksonliam/mjpg-streamer

通过 mjpg-streamer,你可以通过 PC 浏览器访问到板子上的摄像头图像。

MJPG-streamer 是如何结束工作线程的?

MJPG-streamer 运行时一般会有 3 个线程:

主线程;

负责数据的输入的线程 (例如 camera capture thread);

负责输出数据的线程 (例如 http server thread)。

以 http server thread 为例:

plugins/output_http/httpd.c

void *server_thread(void *arg)

{

。..

pthread_cleanup_push(server_cleanup, pcontext);

// 处理连接

while(!pglobal-》stop) {

。..

}

pthread_cleanup_pop(1);

}

pthread_cleanup_push() 用于注册清理函数到栈中,当线程遭取消时,会沿该栈自顶向下依次执行清理函数。

当用户通过按下 ctrl + c 要求结束程序时,主线程会要求杀掉 http server thread 等各种线程:

static void signal_handler(int sig)

{

for(i = 0; i 《 global.outcnt; i++) {

。..

pthread_cancel(servers[id].threadID);

。..

}

}

接下来,当 http server thread 遇到某个取消点时,server_cleanup() 会被调用以完成清理工作。

这里只是简单地分析一下,MJPG-Streamer 里多线程相关的代码挺复杂的,有兴趣的小伙伴们自行阅读吧。
编辑:lyn

原文标题:Linux-C编程 / 多线程 / 如何终止某个线程?

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

应用程序无法进入底层ioctl ?

参照网上的APP程序,写了个测试程序。前面执行都正常,在执行while循环的时候,ioctl函数返回-1;底层可以进入到open和releas...
发表于 05-08 17:18 101次 阅读
应用程序无法进入底层ioctl ?

华为鸿蒙系统市场占有率要达多少才可能存活

目前华为手机最新的系统是EMUI 11,这一系统基于安卓10打造而来,也是华为在升级到鸿蒙之前的最后....
的头像 牵手一起梦 发表于 05-08 13:46 146次 阅读
华为鸿蒙系统市场占有率要达多少才可能存活

知识总结:一篇就让你入Linux内核的大门

Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理....
的头像 strongerHuang 发表于 05-08 10:18 90次 阅读
知识总结:一篇就让你入Linux内核的大门

迅为3399开发板Linux固件编译-Debian系统编译烧写

1 获取 Debian 源码 Ubuntu、Linuxqt 和 debian 系统共用一套源码,获取 debian 源码具体参考“13.1.1 获取 Linux 源码” ...
发表于 05-07 10:03 0次 阅读
迅为3399开发板Linux固件编译-Debian系统编译烧写

「RVBoards-哪吒」首个体验贴?(全志D1,RISC-V 64bit)

一颗soc芯片里面不仅是一个cpu核,包括大量的ip,例如ddr controler、pci-e、A....
发表于 05-07 09:31 449次 阅读
「RVBoards-哪吒」首个体验贴?(全志D1,RISC-V 64bit)

一种基于Linux平台下的FPGA的驱动开发方法

本文系统的介绍了ARM基于Linux平台下的FPGA的驱动开发方法。...
发表于 05-07 06:04 0次 阅读
一种基于Linux平台下的FPGA的驱动开发方法

讲解Linux虚拟机之使用动态库和静态库

了解 Linux 如何使用库,包括静态库和动态库的差别,有助于你解决依赖问题。
发表于 05-06 17:05 144次 阅读
讲解Linux虚拟机之使用动态库和静态库

华为鸿蒙系统流畅度大幅提升六成 超越Android和iOS系统

从华为终端有限公司的相关消息来看,鸿蒙系统预计6月份开始规模化推送,而华为部分用户已经收到鸿蒙2.0....
的头像 鸿蒙系统HarmonyOS 发表于 05-06 15:56 719次 阅读
华为鸿蒙系统流畅度大幅提升六成 超越Android和iOS系统

通过命令行操控电脑的命令大全汇总

下面提供多种方法和各种参数,你可以使用这些参数通过命令行重新启动本地和远程计算机。
发表于 05-05 17:29 59次 阅读
通过命令行操控电脑的命令大全汇总

六个可有效提升Linux服务器安全性的工具和源码

如今我们的许多个人和专业数据都可以在网上获得,因此无论是专业人士还是普通互联网用户,学习安全和隐私的....
发表于 05-05 17:10 436次 阅读
六个可有效提升Linux服务器安全性的工具和源码

推荐这11个可在Linux部署的开源论坛软件

是否想要建立社区论坛或客户支持门户站点?以下是一些可以在服务器上部署的最佳开源论坛软件。
发表于 05-05 17:10 457次 阅读
推荐这11个可在Linux部署的开源论坛软件

基于S3C2410A处理器和嵌入式Linux实现远程医疗系统的设计

远程医疗是网络科技与医疗技术相结合的产物,随着我国经济的发展、科技的进步以及进入老龄化社会的需要,发....
的头像 牵手一起梦 发表于 05-05 16:22 69次 阅读
基于S3C2410A处理器和嵌入式Linux实现远程医疗系统的设计

基于SMP8654芯片和嵌入式Linux实现智能导诊统的设计

过研究基于MIPS架构的SMP8654芯片的硬件架构,并且利用芯片内部的图形加速引擎GFX的方式实现....
的头像 牵手一起梦 发表于 05-05 14:24 169次 阅读
基于SMP8654芯片和嵌入式Linux实现智能导诊统的设计

Linux运维中常见的关键指标参数汇总

Linux运维中常见的关键指标参数汇总
发表于 05-05 09:06 356次 阅读
Linux运维中常见的关键指标参数汇总

保证BPF程序安全的BPF验证器介绍

1. 前言 我们可以使用BPF对Linux内核进行跟踪,收集我们想要的内核数据,从而对Linux中的....
的头像 Linuxer 发表于 05-03 11:27 101次 阅读
保证BPF程序安全的BPF验证器介绍

Linux关于UDP的学习详细讲解

UDP(用户数据报协议)没有连接的,是面向数据报的,是不可靠
的头像 beanxyy 发表于 05-02 16:42 137次 阅读
Linux关于UDP的学习详细讲解

学习嵌入式开发的八大阶段、方法及注意事项

初学嵌入式开发要学什么?掌握好这几个方向肯定没问题,如果你选择好了专业方向,那就别放弃了,努力的学习....
发表于 05-02 13:11 619次 阅读
学习嵌入式开发的八大阶段、方法及注意事项

RISC-V未来发展空间如何?

据报道,我们口袋中的大多数智能手机都包含基于Arm架构的计算机芯片,而Intel的x86架构在笔记本....
发表于 05-02 12:01 506次 阅读
RISC-V未来发展空间如何?

MIPS落幕,转身加入RISC-V阵营

曾经在 PC 时代与 X86、ARM 三分天下的 MIPS,几经辗转之后,于近日迎来了命运的终章,正....
发表于 05-02 11:14 651次 阅读
MIPS落幕,转身加入RISC-V阵营

关于Linux的15个实用小技巧详解

熟悉 Linux 系统的同学都知道,它高效主要体现在命令行。通过命令行,可以将很多简单的命令,通过自....
的头像 Linux爱好者 发表于 05-02 11:14 62次 阅读
 关于Linux的15个实用小技巧详解

RISC-V能否成为开源硬件发展的基石?

今年是Linux内核发布三十周年。二十年前,程序员认为Linux只是一种利基技术,猜测它行不通。然而....
发表于 05-02 09:25 425次 阅读
RISC-V能否成为开源硬件发展的基石?

如何充分发挥出NVMe盘的持久性?

在过去十几年中,CPU的性能提升了100倍以上,而传统的HDD硬盘(Hard Disk Drive)....
发表于 05-01 09:37 885次 阅读
如何充分发挥出NVMe盘的持久性?

华为鸿蒙与linux关系

操作系统可以说是智能手机的灵魂,在如今全球智能手机市场,谷歌的Android系统和苹果的iOS系统已....
的头像 电子魔法师 发表于 04-30 16:33 2308次 阅读
华为鸿蒙与linux关系

请教Linux下的ACEX1K50设备驱动是如何实现的?

Altera FLEX/ACEX芯片结构是如何构成的? Intel XScale PXA270处理器的系统存储器接口怎样去设计? Linux下的...
发表于 04-30 06:44 0次 阅读
请教Linux下的ACEX1K50设备驱动是如何实现的?

不会Java不用慌用C/C++照样搞定安卓APP!

首先Qt就不多说了,大家应该都有了解,跨平台的应用程序开发框架,Windows、Linux、Andr....
的头像 嵌入式ARM 发表于 04-29 13:49 183次 阅读
不会Java不用慌用C/C++照样搞定安卓APP!

Wi-Fi链接控制器Linux用户指南

本用户指南介绍如何在 ATWILC1000 SD 卡或 ATWILC3000 Shield 板(安装....
发表于 04-29 10:53 20次 阅读
Wi-Fi链接控制器Linux用户指南

ATWILC器件Linux移植指南

本用户指南介绍了如何将 ATWILC1000 和 ATWILC3000 Linux 驱动程序移植到另....
发表于 04-29 10:10 24次 阅读
ATWILC器件Linux移植指南

LR-LINK联瑞四光口千兆以太网卡产品特性介绍

自全球贸易战争爆发以来,以美国为首的西方国家对我国商品进行经济制裁和科技封锁,包括以华为、中兴在内的....
发表于 04-28 15:32 87次 阅读
LR-LINK联瑞四光口千兆以太网卡产品特性介绍

求一款基于Murphypinyin的嵌入式键盘设计

本文根据手持终端的特点,设计出一款矩阵键盘,并在Linux平台下开发出键盘的驱动程序。采用Qt/Embedded构建图形界面,通过对...
发表于 04-28 06:50 0次 阅读
求一款基于Murphypinyin的嵌入式键盘设计

请问一下linux里常提到的程序睡眠是什么意思?

linux里常提到的程序的睡眠是什么意思?
发表于 04-28 06:43 0次 阅读
请问一下linux里常提到的程序睡眠是什么意思?

Linux所支持的文件系统类型有哪几种?

Linux所支持的文件系统类型有哪几种?
发表于 04-28 06:42 0次 阅读
Linux所支持的文件系统类型有哪几种?

Linux常用的头文件有哪些?

Linux常用的头文件有哪些?
发表于 04-28 06:41 0次 阅读
Linux常用的头文件有哪些?

利用systemd服务实现音频应用自启

经过之前文章的介绍我们已经了解到OKMX8MQ-C开发板是基于ARM®Cortex-A53和Cort....
发表于 04-27 14:30 31次 阅读
利用systemd服务实现音频应用自启

关于VS Code实现远程开发的配置方法详细教程

VS Code几乎是所有的程序员必备的工具之一,据说全球一般的开发者都使用过VS Code这款工具。
的头像 strongerHuang 发表于 04-27 10:15 228次 阅读
关于VS Code实现远程开发的配置方法详细教程

ThinkPHP 6.0完全开发手册资源下载

ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开....
发表于 04-27 09:20 27次 阅读
ThinkPHP 6.0完全开发手册资源下载

关于Trampoline操作系统有哪些研究?

OSEK操作系统研究现状及相关工作 OSEK OS及Trampoline分析 在Linux/x86上开发Trampoline应用程序...
发表于 04-27 06:36 0次 阅读
关于Trampoline操作系统有哪些研究?

如何去实现Linux的DS18B20驱动程序?

Linux的设备驱动程序 DS18B20的结构和工作原理是什么? 如何去实现Linux的DS18B20驱动程序? ...
发表于 04-27 06:30 0次 阅读
如何去实现Linux的DS18B20驱动程序?

详细介绍eBPF的起源和工作原理及作用

BPF源头起源于一篇1992年的论文,这篇论文主要提出一种新的网络数据包的过滤的框架,如下图所示。
的头像 Linuxer 发表于 04-26 16:09 176次 阅读
详细介绍eBPF的起源和工作原理及作用

如何尽可能地加强Linux的安全性和隐私性?

本指南旨在说明如何尽可能地加强Linux的安全性和隐私性,并且不限于任何特定的指南。 免责声明:如果....
的头像 Linux爱好者 发表于 04-25 14:58 179次 阅读
如何尽可能地加强Linux的安全性和隐私性?

关于Linux的内核代码风格

从编码风格错误开始 曾经在开发Linux内核驱动的时候,创建了一个补丁文件,但是在把补丁打到主分支的....
的头像 Linux爱好者 发表于 04-25 14:50 149次 阅读
关于Linux的内核代码风格

9个Linux中查看系统硬件信息的实用命令

在Linux下,我们经常需要查看系统的硬件信息, 这里我罗列了查看系统硬件信息的实用命令,并做了分类....
的头像 Linux爱好者 发表于 04-25 14:46 159次 阅读
9个Linux中查看系统硬件信息的实用命令

Linux中应该如何入侵排查?

账号安全: 1、用户信息文件 /etc/passwd # 格式:accountUIDGECOSshe....
的头像 Linux爱好者 发表于 04-25 14:43 144次 阅读
Linux中应该如何入侵排查?

小米MIX FOLD折叠40万次挑战成功 国内首款Linux系统的教育智能本发布

小米MIX FOLD折叠40万次挑战成功 在一个微信视频号「雷军」中有一个直播,小米发起了一个小米 ....
的头像 璟琰乀 发表于 04-24 11:35 1074次 阅读
小米MIX FOLD折叠40万次挑战成功 国内首款Linux系统的教育智能本发布

Elektrobit与SUSE合作在中国提供车规级Linux产品

EB corbos Linux通过此次合作,EB的汽车行业经验和专业技术与SUSE的IT基础架构经验....
发表于 04-23 13:55 1376次 阅读
Elektrobit与SUSE合作在中国提供车规级Linux产品

蓝星科技嵌入式基础软件产品介绍

当前,智能化技术发展迅猛,各行各业向智能化、数字化转型已成为市场趋势,相关基础软件生态圈对于企业智能....
发表于 04-17 10:09 149次 阅读
蓝星科技嵌入式基础软件产品介绍

蓝星科技:致力于基础软件生态建设,助力国产芯片发展

随着中美贸易战的爆发,美国一度禁止芯片制造商向以华为为代表的中国企业出售相关芯片产品,阻挠正常贸易合....
发表于 04-17 10:04 198次 阅读
蓝星科技:致力于基础软件生态建设,助力国产芯片发展

浅析Linux控制台、终端与shell之间的关系

当使用Linux时,我们经常会遇到终端和外壳程序的概念。 例如,在桌面版Ubuntu中,我们可以右键....
的头像 beanxyy 发表于 04-15 15:57 290次 阅读
浅析Linux控制台、终端与shell之间的关系

Linux常用C函数库电子版下载

你好!本人有幸在坊间得到一名为“Linux C 函数参考”的文本文件,并在此基础重新排版并制成htm....
发表于 04-15 09:33 25次 阅读
Linux常用C函数库电子版下载

关于Joplin的简介与应用及使用

Joplin是一个免费的开源笔记记录和待办事项应用程序,可以直接从应用程序或文本编辑器中进行复制,标....
的头像 Linux爱好者 发表于 04-13 11:32 705次 阅读
关于Joplin的简介与应用及使用

linux中的core dump调试与运用详解

调试,是开发流程中一个非常重要的环节。每个程序员都应,具备调试代码的能力,尤其对于从事 Linux ....
的头像 Linux爱好者 发表于 04-12 14:24 211次 阅读
linux中的core dump调试与运用详解

关于Linux的自动化小技巧详解

开机启动应该是我们很经常的需求了,我们常需要在开机时就自动执行某些命令来开启服务,进程等,有了它我们....
的头像 Linux爱好者 发表于 04-12 13:38 217次 阅读
关于Linux的自动化小技巧详解

Linux系统是什么,它的应用都有哪些

Linux是什么系统,有什么应用? Linux是一种自由和开放源代码的类UNIX操作系统。该操作系统....
发表于 04-12 10:42 72次 阅读
Linux系统是什么,它的应用都有哪些

为开源新时代赋能 2021开源科技节完美落幕

“开源科技节”由开源科技OSTech、Linux Foundation、华为、腾讯开源联盟、腾讯云、....
的头像 章鹰 发表于 04-12 10:18 4334次 阅读
为开源新时代赋能 2021开源科技节完美落幕

Enclustra瑞苏盈科:航天发射数据记录仪

在这种情况下,基于FPGA的解决方案的优点(如固有的并行性、极高的带宽、灵活性、对广泛接口的支持以及....
发表于 04-12 10:06 2428次 阅读
Enclustra瑞苏盈科:航天发射数据记录仪

Linux系统中的进程之间通信

一、Linux 系统中的进程之间通信(IPC) 二、基于 Socket 通信的优点 三、MQTT 消....
的头像 玩转单片机 发表于 04-12 10:06 389次 阅读
Linux系统中的进程之间通信

浅析物理内存与虚拟内存的关系及其管理机制

本文主要介绍内存管理机制:物理内存与虚拟内存的关系,Linux内存管理机制,Python内存管理机制....
的头像 Linux爱好者 发表于 04-12 09:55 337次 阅读
浅析物理内存与虚拟内存的关系及其管理机制

如何在Vmware虚拟机上搭建Ubuntu Linux开发环境详解

对于刚接触嵌入式 Linux 系统开发的同学来说,搭建开发环境是一个不小的挑战,我看到过很多在入门边....
的头像 FPGA之家 发表于 04-09 17:44 653次 阅读
如何在Vmware虚拟机上搭建Ubuntu Linux开发环境详解

ARM处理器和嵌入式Linux技术综述

ARM处理器和嵌入式Linux技术综述说明。
发表于 04-09 09:22 62次 阅读
ARM处理器和嵌入式Linux技术综述

对10个常见的 Linux终端仿真器详细解答

默认情况下,所有的 Linux 发行版都已经预装了“终端terminal”应用程序或“终端仿真器te....
的头像 Linux爱好者 发表于 04-08 14:12 243次 阅读
对10个常见的 Linux终端仿真器详细解答

基于Linux和RT—Linux实现实时机器人控制系统的设计

实时系统是能够在确定的时间内执行计算或处理事务并对外部事件作出响应的计算机系统。对工业机器人控制来说....
的头像 电子设计 发表于 04-08 09:42 6222次 阅读
基于Linux和RT—Linux实现实时机器人控制系统的设计

AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)

TI AM437x高性能处理器基于ARM Cortex-A9内核。 这些处理器通过3D图形加速得到增强,可实现丰富的图形用户界面,还配备了协处理器,用于进行确定性实时处理(包括EtherCAT,PROFIBUS,EnDat等工业通信协议)。该器件支持高级操作系统(HLOS)。基于Linux的® 可从TI免费获取。其它HLOS可从TI的设计网络和生态系统合作伙伴处获取。 这些器件支持对采用较低性能ARM内核的系统升级,并提供更新外设,包括QSPI-NOR和LPDDR2等存储器选项。 这些处理器包含功能方框图中显示的子系统,并且后跟相应的“说明”中添加了更多信息说明。 处理器子系统基于ARM Cortex-A9内核,PowerVR SGX™图形加速器子系统提供3D图形加速功能以支持显示和高级用户界面。 可编程实时单元子系统和工业通信子系统(PRU-ICSS与ARM内核分离,允许单独操作和计时,以实现更高的效率和灵活性.PRU-ICSS支持更多外设接口和EtherCAT,PROFINET,EtherNet /IP,PROFIBUS,以太网Powerlink,Sercos,EnDat等...
发表于 09-25 11:51 280次 阅读
AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)