Linux 多线程开发-线程的结束pthread_kill和pthread_cancel

1、线程结束的方式

  • (1)线程函数中调用pthread_exit函数,不会导致对象析构,可以使用
  • (2)线程所属的进程结束,进程调用exit,线程C++对象不会销毁,不安全,属于被动结束
  • (3)线程函数执行返回return,好的退出方式
  • (4)线程被同一进程或其他线程通知结束,属于被动结束

2、线程主动结束

线程主动结束使用return或者pthread_exit函数,原型如下:

void pthread_exit(void *retval);

retval是线程返回给主线程的值,线程函数返类型是void *。在main线程中调用pthread_exit(NULL)将结束main线程,但是进程不立即退出。

示例:

#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>void thread_fun(void *arg)
{static int count = 1;//必须静态,传出的地址不改变pthread_exit((void*)&count);
}
int main(int argc,char * argv[])
{int *pretv;int pid;if(0 != pthread_creat(&pid,NULL,(void *(*)(void *))thread_fun,NULL)){printf("pthread creat error\n");return -1;}pthread_join(pid,(void**)&pretv);printf("thread fun retval:%d\n",*pretv);return 0;
}

3、线程被动结束

线程被动结束的两种方法:

  • 同一进程的其他线程中通过函数pthread_kill发送信号给要结束的进程,目标进程收到后再退出
  • 同一进程的其他线程中通过函数pthread_cancel取消目标的执行

pthread_kill的函数原型:

void pthread_kill(pthread_t pid, int signal);

pid:接收信号线程的线程ID;signal就是信号,大于0的值,如果等于0就是探测线程是否存在,执行成功返回0,否则返回错误码,ESRCH线程不存在,EINVAL信号不合法。

向指定线程发送信号,如果线程代码不处理,则调用信号的默认处理方法。线程信号例如:Linux 进程通信 -- 信号

https://blog.csdn.net/u010058695/article/details/102787168

pthread_cancel的函数原型:

void pthread_cancel(pthread_t pid);

pid:要被取消线程的ID,向指定线程发送取消执行的请求,请求终止,但不一定就终止,系统不会马上取消线程,只有在被取消线程下次调用一些C库函数如printf或者pthread_testcancel(让内核去检测是否需要取消当前线程)时,才会真正结束,在线程执行过程中检测是否有未响应取消信号的地方叫做取消点。

示例:

#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>void thread_fun(void *arg)
{int count = 0;while(1){i++;pthread_testcancel();}return;
}
int main(int argc,char * argv[])
{int *pretv;int pid;if(0 != pthread_creat(&pid,NULL,(void *(*)(void *))thread_fun,NULL)){printf("pthread creat error\n");return -1;}pthread_cancel(pid);pthread_join(pid,(void**)&pretv);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows7休眠状态下载技巧攻略

Windows7休眠状态下载技巧攻略 你想让你的快车或者是迅雷通宵下载电影&#xff0c;而且还能省电么?或许你会说&#xff0c;我不关机&#xff0c;给迅雷和快车添加完下载任务&#xff0c;挂在那里不就可以了吗?这没错&#xff0c;开着电脑通宵下载是可以&#xff0c;但这样的方…

支付模块设计

1.背景知识 ssl:SSL为安全套接层&#xff0c;SSL 安全协议最初是由美国网景 Netscape Communication 公司设计开发的&#xff0c;全称为&#xff1a;安全套接层协议 (Secure Sockets Layer) &#xff0c; 它指定了在应用程序协议 ( 如 HTTP 、 Telnet 、 FTP) 和 TCP/IP 之间提…

NB-IOT/Lora/Zigbee/WIFI/蓝牙无线组网方式的对比

NB-IOT/Lora/Zigbee/WIFI/蓝牙无线组网方式的对比 LoRa LoRa(长 距离)是由Semtech公司开发的一种技术&#xff0c;典型工作频率在美国是915MHz&#xff0c;在欧洲是868MHz&#xff0c;在亚洲是433MHz。LoRa的物理层 (PHY)使用了一种独特形式的带前向纠错(FEC)的调频啁啾扩频技…

[react] React必须使用JSX吗?

[react] React必须使用JSX吗&#xff1f; 首先给出答案&#xff0c;不是必须的 只不过通过JSX&#xff0c;你可以简单明了的知道UI是怎样的 JSX is a syntax extension to JavaScript. We recommend using it with React to describe what the UI should look like 个人简介 …

Qt 设置textEdit插入文本的字体、大小和颜色

1:、打开字体对话框选择字体 //用到头文件&#xff1a;#include <QFontDialog> void MainWindow::on_pushButton_font_clicked() {bool ok;QFont f QFontDialog::getFont(&ok, QFont("Consolas",9), this,"设置显示字体");if(ok){font f;} } …

开发板屏幕截图-适用于本公司海思和智源平台

C源码(screenshot.c)&#xff1a; #include <stdio.h> #include <stdlib.h> #include <sys/ioctl.h> #include <unistd.h> #include <time.h> #include <string.h> #include <fcntl.h> #include <malloc.h> #include <linu…

听小鹏讲废话之OSI

大家好&#xff0c;在下小鹏&#xff0c;大学刚毕业1年&#xff0c;目前从事华为网络设备工作。写这篇文章&#xff0c;有两个目的&#xff0c;第一&#xff0c;和大家分享学习的乐趣&#xff0c;俗话说&#xff0c;没有学不会的学生&#xff0c;只有教不会的老师&#xff1b;第…

python spark 配置

前提&#xff1a;已经装好 java 1.8 和 hadoop 2.7 1. 下载解压放后的目录 /Users/gao/spark-1.4.1-bin-hadoop2.6 2. 在~/.bash_profile 中加入 export PYTHONPATH$PYTHONPATH:/Users/gao/spark-1.4.1-bin-hadoop2.6/python 3. 将/Users/gao/spark-1.4.1-bin-hadoop2.6/python…

Linux du查看磁盘文件夹占用容量

1、du 查看当前文件夹的占用容量&#xff1a; du -sh eg. 查看/usr的占用 2、指定层级查看 查看当前目录下最多一级目录的容量 du -h --max-depth1

Linux下串口参数VTIME和VMIN的用法

VTIME指定了等待的时间,VMIN指定了读取字符的最小数量。 它们不同组合地取值会得到不同的结果&#xff0c;分别如下&#xff1a; 1&#xff0e;当VTIME>0&#xff0c;VMIN>0时。read调用将保持阻塞直到读取到第一个字符&#xff0c;读到了第一个字符之后开始计时&#xf…

[react] 在React中怎么将参数传递给事件?

[react] 在React中怎么将参数传递给事件&#xff1f; 如果使用箭头函数声明函数&#xff0c;调用方式&#xff1a; 不传参&#xff1a;this.func1&#xff0c;如果不传参&#xff0c;事件参数默认会自己添加上 传参&#xff1a; (e) > {this.func1(e,param1, param2)}&…

修改系统默认路径,如收藏夹、桌面、我的文档

修改系统默认路径&#xff0c;如收藏夹、桌面、我的文档。。。。 修改分支为&#xff1a;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders 上面改的是当前用户的配置噢!

Struts2学习笔记《二》

struts.xml配置文件的全部配置元素&#xff1a;       转载于:https://www.cnblogs.com/abc8023/p/4760284.html

dataset.xsd的定义(vs2008)

定义数据集就是把表拉到.xsd的界面的名称如图&#xff08;http://hi.csdn.net/attachment/201106/9/0_13076420264QqD.gif &#xff09; T_UsersTableAdapter adapter new T_UsersTableAdapter();记得添加引用类型&#xff1b;

[react] 怎样使用Hooks获取服务端数据?

[react] 怎样使用Hooks获取服务端数据&#xff1f; import React, { useState, useEffect } from react; import axios from axios; function App() {const [data, setData] useState({ hits: [] });useEffect(async () > {const result await axios(https://api/url/to/…

Linux mount挂载和umont卸载U盘

1、树莓派插入U盘没有自动挂载&#xff0c;可以在/dev/下看到盘符&#xff0c;但是打不开&#xff0c;需要挂载到指定的文件位置。 2、挂载U盘使用mount命令。 &#xff08;1&#xff09;首先查看插入设备后的文件描述符&#xff1a;找到sda1 (2)新建文件夹 (3)挂载U盘到Udis…

iOS 如果刷新TableViewCell上得数据是空的 添加尾部暂无数据提示

其实很简单 只需要给tableView底部添加一个View 然后View上添加一个Label就可以了 做个衣服判断 数组为空的话则给一个这样的View 转载于:https://www.cnblogs.com/guochaoboke/p/4761429.html

Learning Perl 2

1.子程序 1).创建子程序&#xff1a;使用关键字sub sub marine { print "Hello, world\n"; } calling subroutines&#xff0c;使用&号 &marine (2).返回值&#xff1a;所有的子程序最后一个表达式的运算结果都当作返回值。所以子程序只有“”有用返回值“和…

Ubuntu如何卸载安装的软件以FileZilla为例

1、查看已安装的软件包&#xff1a; dpkg --list 2、卸载FileZilla sudo apt-get remove filezilla

小明系列问题――小明序列(LIS)

小明系列问题――小明序列Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4521Description 大家都知道小明最喜欢研究跟序列有关的问题了&#xff0c;可是也就因为这样&#xff0c;小明几乎已经玩遍各种序列问…