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

    文章

    11284

    浏览量

    209264
  • 多线程
    +关注

    关注

    0

    文章

    278

    浏览量

    19940
  • c编程
    +关注

    关注

    0

    文章

    94

    浏览量

    29357

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

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

收藏 人收藏

    评论

    相关推荐

    socket 多线程编程实现方法

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

    Python多线程和多进程的区别

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

    一文掌握Python多线程

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

    ESP32会不会有多线程问题,需要加锁吗?

    ESP32会不会有多线程问题,需要加锁吗
    发表于 07-19 08:05

    多线程设计模式到对 CompletableFuture 的应用

    最近在开发 延保服务 频道页时,为了提高查询效率,使用到了多线程技术。为了对多线程方案设计有更加充分的了解,在业余时间读完了《图解 Java 多线程设计模式》这本书,觉得收获良多。本篇文章将介绍其中
    的头像 发表于 06-26 14:18 331次阅读
    从<b class='flag-5'>多线程</b>设计模式到对 CompletableFuture 的应用

    鸿蒙开发:【线程模型】

    管理其他线程的ArkTS引擎实例,例如使用TaskPool(任务池)创建任务或取消任务、启动和终止Worker线程
    的头像 发表于 06-13 16:38 390次阅读
    鸿蒙开发:【<b class='flag-5'>线程</b>模型】

    bootloader开多线程做引导程序,跳app初始化后直接进hardfualt,为什么?

    如标题,想做一个远程升级的项目,bootloader引导区域和app都是开多线程跑的,就是自己写了个小的任务调度器,没什么功能主要是想让程序快速的响应,延时不会对其他程序造成堵塞,程序测试
    发表于 04-18 06:07

    java实现多线程的几种方式

    Java实现多线程的几种方式 多线程是指程序包含了两个或以上的线程,每个线程都可以并行执行不同的任务或操作。Java
    的头像 发表于 03-14 16:55 676次阅读

    python5种线程锁盘点

    线程安全是多线程或多进程编程的一个概念,在拥有共享数据的多条线程并行执行的程序
    发表于 03-07 11:08 1572次阅读
    python<b class='flag-5'>中</b>5种<b class='flag-5'>线程</b>锁盘点

    AT socket可以多线程调用吗?

    请问AT socket 可以多线程调用吗? 有互锁机制吗,还是要自己做互锁。
    发表于 03-01 08:22

    linux多线程编程实例

    linux线程
    的头像 发表于 02-15 21:16 453次阅读
    <b class='flag-5'>linux</b><b class='flag-5'>多线程</b><b class='flag-5'>编程</b>实例

    Redis7单线程多线程详解

    主要是指Redis的网络IO和键值对读写是由一个线程来完成的。
    的头像 发表于 01-16 17:33 1838次阅读
    Redis7单<b class='flag-5'>线程</b>与<b class='flag-5'>多线程</b>详解

    什么是守护线程?守护线程的底层原理和使用示例

    大家好,今天这篇文章来梳理一下有关守护线程的相关问题,这也是之前曾经有被问到过的面试题,在此之前我们先看一看守护线程的使用示例
    的头像 发表于 01-05 11:01 1404次阅读
    什么是守护<b class='flag-5'>线程</b>?守护<b class='flag-5'>线程</b>的底层原理和使用<b class='flag-5'>示例</b>

    使用C++11新特性实现一个通用的线程池设计

    C++11标准之前,多线程编程只能使用pthread_xxx开头的一组POSIX标准的接口。从C++11标准开始,多线程相关接口封装在了
    的头像 发表于 12-22 13:58 1257次阅读
    使用<b class='flag-5'>C</b>++11新特性实现一个通用的<b class='flag-5'>线程</b>池设计

    你还是分不清多进程和多线程吗?一文搞懂!

    你还是分不清多进程和多线程吗?一文搞懂! 多进程和多线程是并发编程中常见的两个概念,它们都可以用于提高程序的性能和效率。但是它们的实现方式和使用场景略有不同。 1. 多进程: 多进程指的是在操作系统
    的头像 发表于 12-19 16:07 558次阅读