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

    文章

    11296

    浏览量

    209358
  • 多线程
    +关注

    关注

    0

    文章

    278

    浏览量

    19946
  • c编程
    +关注

    关注

    0

    文章

    94

    浏览量

    29359

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

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

收藏 人收藏

    评论

    相关推荐

    socket 多线程编程实现方法

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

    Python多线程和多进程的区别

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

    一文掌握Python多线程

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

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

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

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

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

    鸿蒙开发:【线程模型】

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

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

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

    鸿蒙原生应用开发-ArkTS语言基础类库多线程I/O密集型任务开发

    使用异步并发可以解决单次I/O任务阻塞的问题,但是如果遇到I/O密集型任务,同样会阻塞线程其它任务的执行,这时需要使用多线程并发能力来进行解决。 I/O密集型任务的性能重点通常不在于CPU的处理
    发表于 03-21 14:57

    java实现多线程的几种方式

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

    python5种线程锁盘点

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

    AT socket可以多线程调用吗?

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

    什么是多核多线程?多核多线程如何提高程序的运行效率?

    线程无法充分利用多核处理器的并行计算能力。
    的头像 发表于 02-20 10:22 1351次阅读

    linux多线程编程实例

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

    Redis7单线程多线程详解

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

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

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