0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

FPGA之家 ? 来源:CSDN技术社区 ? 作者:老吴的嵌入式之旅 ? 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
    +关注

    关注

    87

    文章

    11522

    浏览量

    214379
  • 多线程
    +关注

    关注

    0

    文章

    279

    浏览量

    20494
  • c编程
    +关注

    关注

    0

    文章

    95

    浏览量

    29633

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    UVC+MSC实现MSC线程未运行的原因?

    我正在尝试使用 EZUSB 运行 UVC + MSC。我有以下内容。但看起来只有 UVC 线程在运行,而 MSC 没有运行。fw 不响应 MSC 命令。我确保 LPM 已被禁用,只是为了检查传感器
    发表于 07-16 07:08

    深度剖析 RT-Thread 线程调度流程

    rt_system_scheduler_start:调度系统第一个线程rt_hw_context_switch_to:初始化上下文切换环境,触发PendSV异常first_thread:系统优先级最高
    的头像 发表于 06-25 18:24 ?797次阅读
    深度剖析 RT-Thread <b class='flag-5'>线程</b>调度流程

    多线程的安全注意事项

    多线程安全是指多个线程同时访问或修改共享资源时,能够保证程序的正确性和可靠性。 开发者选择TaskPool或Worker进行多线程开发时,在TaskPool和Worker的工作线程中导
    发表于 06-20 07:49

    鸿蒙5开发宝藏案例分享---跨线程性能优化指南

    ;>Worker</span>做多线程开发时,总遇到对象跨线程卡顿的问题,原来鸿蒙早就提供了解决方案。下面结合代码和实战案例,带你彻底玩转性能优化! 一、痛点:跨线程
    发表于 06-12 17:13

    工控一体机多线程任务调度优化:聚徽分享破解工业复杂流程高效协同密码

    在当今工业 4.0 的浪潮下,工业生产正朝着高度自动化、智能化的方向大步迈进。生产流程日益复杂,众多任务需要同时、高效地协同执行,这对工业控制系统的核心 —— 工控一体机提出了前所未有的挑战。多线程
    的头像 发表于 05-28 14:06 ?204次阅读

    摩尔线程Linux驱动v3.0.0发布

    近日,摩尔线程正式推出Linux驱动程序v3.0.0,全面支持图形显卡MTT S80和高性能专业显卡MTT X300。作为v2.7.0RC4之后的重大升级版本,本次更新实现了多项关键技术突破:在架构
    的头像 发表于 05-08 11:38 ?552次阅读
    摩尔<b class='flag-5'>线程</b><b class='flag-5'>Linux</b>驱动v3.0.0发布

    进程、线程、协程傻傻分不清?一文带你彻底扒光它们的\"底裤\"!

    外卖员(线程C):负责送外卖他们共用: 原料冰箱(共享内存) 工作台(栈空间)但不共享: 自己的工牌(线程ID) 心情日记(线程本地存储) 代码
    发表于 03-26 09:27

    请问如何在Python实现多线程与多进程的协作?

    大家好!我最近在开发一个Python项目时,需要同时处理多个任务,且每个任务需要不同的计算资源。我想通过多线程和多进程的组合来实现并发,但遇到了一些问题。 具体来说,我有两个任务,一个是I/O密集型
    发表于 03-11 06:57

    请问rt-thread studio如何进行多线程编译?

    ,使用的是5800h+32g内存+sn550 ssd,开启16线程编译时cpu的占用率也只能到30%,编译完整个工程需要3分钟 感觉多线程编译设置没有生效,有办法提高编译速度吗
    发表于 02-19 08:30

    socket 多线程编程实现方法

    在现代网络编程多线程技术被广泛应用于提高服务器的并发处理能力。Socket编程是网络通信的基础,而将多线程技术应用于Socket
    的头像 发表于 11-12 14:16 ?1074次阅读

    摩尔线程完成股改,筹备上市

    近日,摩尔线程智能科技(北京)股份有限公司(简称“摩尔线程”)宣布已完成股改,并正积极筹备上市。据国家企业信用信息公示系统最新查询结果显示,摩尔线程的市场主体类型在10月28日已从其他有限责任公司
    的头像 发表于 11-12 14:15 ?1242次阅读

    一文搞懂Linux进程的睡眠和唤醒

    机制 1)信号(Signal): 进程可以通过接受特定信号被唤醒。 2)条件变量(Condition Variable): 多线程编程中用于同步多个线程的工具,可以让一个线程在某些
    发表于 11-04 15:15

    Python多线程和多进程的区别

    Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之一。在本文中,我们将探讨Python多线程
    的头像 发表于 10-23 11:48 ?1076次阅读
    Python<b class='flag-5'>中</b><b class='flag-5'>多线程</b>和多进程的区别

    CPU线程和程序线程的区别

    CPU的线程与程序的线程在概念、作用、实现方式以及性能影响等方面存在显著差异。以下是对两者区别的详细阐述,旨在深入探讨这一技术话题。
    的头像 发表于 09-02 11:18 ?2209次阅读

    一文掌握Python多线程

    使用线程可以把占据长时间的程序的任务放到后台去处理。
    的头像 发表于 08-05 15:46 ?1340次阅读