linux 进程状态函数,三十七、Linux 线程——线程清理和控制函数、进程和线程启动方式比较、线程的状态转换...

37.1 线程清理和控制函数

#include

void pthread_cleanup_push(void (* rtn)(void *), void *arg);

void pthread_cleanup_pop(int execute);

函数参数

rtn:清理函数指针

arg:调用清理函数传递的参数

execute:值 1 时,执行线程清理函数;值 0 时,不执行线程清理函数

返回值

成功,返回 0;否则,返回错误编号

触发线程调用清理函数的工作

调用 pthread_exit

响应取消请求

用非零 execute 参数调用 thread_cleanup_pop 时

#include

#include

#include

/** 定义线程清理函数 */

void clean_fun(void *arg)

{

char *s = (char *)arg;

printf("clean_fun: %s\n", s);

}

void *th_fun(void *arg)

{

int execute = (int )arg;

pthread_cleanup_push(clean_fun, "first clean func");

pthread_cleanup_push(clean_fun, "second clean func");

printf("thread running %lx\n", pthread_self());

pthread_cleanup_pop(execute);

pthread_cleanup_pop(execute);

return (void *);

}

int main(void)

{

int err;

pthread_t th1, th2;

if((err = pthread_create(&th1, NULL, th_fun, (void *))) != ) {

perror("pthread create error");

}

pthread_join(th1, NULL);

printf("th1(%lx) finished\n", th1);

if((err = pthread_create(&th2, NULL, th_fun, (void *))) != ) {

perror("pthread create error");

}

pthread_join(th2, NULL);

printf("th2(%lx) finished\n", th2);

return ;

}

运行如下:

639ede41e518ddd2488a918a5344e865.png

线程结束,会触发调用最终的 clean 函数,调用的时候会根据 pop 里面的入栈顺序,先入后出进行调用。

37.2 进程和线程启动方式比较

da607ef96e0af850f8f99fb58148656e.png

37.3 线程的状态转换

f5d7adee88c898869d2641a76319a757.png

Java-多线程第三篇3种创建的线程方式、线程的生命周期、线程控制、线程同步、线程通信

1.Java使用Thread类代表线程.     所有的线程对象必须是Thread类或其子类的实例. 当线程继承Thread类时,直接使用this即可获取当前线程,Thread对象的getName() ...

11.python之线程,协程,进程,

一,进程与线程 1.什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行 ...

“全栈2019”Java多线程第三十七章:如何让等待的线程无法被中断

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

Java并发编程原理与实战三十七:线程池的原理与使用

一.简介 线程池在我们的高并发环境下,实际应用是非常多的!!适用频率非常高! 有过使用过Executors框架的朋友,可能不太知道底层的实现,这里就是讲Executors是由ThreadPoolExe ...

第三十七章 POSIX线程(一)

POSIX线程库相关介绍   与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都有"pthread_"开头   要使用这些函数库,都需要加入头文件"

VC启动一个新线程的三种方法

第一种AfxBeginThread() 用AfxBeginThread()函数来创建一个新线程来执行任务,工作者线程的AfxBeginThread的原型如下: CWinThread* AfxBegin ...

Linux常用三十七条指令

Linux常用三十七条指令 基础指令(11):ls,pwd,cd,mkdir,touch,cp.mv,rm,vim,>/>>/,cat 进阶指令(10):df,free,head,t ...

[转帖]Linux系统进程的知识总结,进程与线程之间的纠葛...

Linux系统进程的知识总结,进程与线程之间的纠葛... https://cloud.tencent.com/developer/article/1500509 当一个程序开始执行后,在开始执行到执行 ...

Linux系统进程的知识总结,进程与线程之间的纠葛...

来源:嵌入式ARM 当一个程序开始执行后,在开始执行到执行完毕退出这段时间内,它在内存中的部分就叫称作一个进程. Linux 是一个多任务的操作系统,也就是说,在同一时间内,可以有多个进程同时执行.我 ...

随机推荐

51nod比赛

http://www.cnblogs.com/wzj-is-a-juruo/p/5619901.html

一步一步写一个简单通用的makefile(四)--写一个通用的makefile编译android可执行文件

通常要把我们自己的的代码编译成在android里面编译的可执行文件,我们通常是建一个文件夹 . ├── Android.mk ├── Application.mk ├── convolve.cl ├─ ...

Angular过滤器 自定义及使用方法

首先设置自定义过滤器. 定义模块名:angular .module('myApp') .filter('filterName',function(){ return function(要过滤的对象,参 ...

form表单提交

1.form表单提交.html页面失败

Linux 查找命令汇总

linux下查找命令挺多,本文以列表方式说明which.whereis.locate.find命令的区别: 命令 概述 语法 示例 适用OS 搜索结果 which 在PATH变量指定的路径中,搜索某个 ...

STL --> set用法

set用法 一.set和multiset基础 set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. 需要包含头文件: #include

esxi虚拟机克隆后的主机网卡设置

windows 在虚拟机配置页面右击属性,编辑虚拟机设置,删除掉原来的网卡,重新添加新的网卡 进入系统以后,进入 windows/system32 找到sysprep,运行等待电脑重启 重启过程会稍微 ...

MySQL concat用法举例

concat配合information_schema的应用 1    concat的一般用法主要是用于拼接 示例: 执行语句 SELECT CONCAT('M','y','S','Q','L') 可以 ...