线程
时间:2019-12-26
本文章向大家介绍线程,主要包括线程使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
------------恢复内容开始------------
进程的特点:
进程有独立地地址空间。
LINUX为每个进程创建task_struct
每个进程都参与内核调度,互不影响
线程的特点:
进程在切换时,系统开销大,引入轻量级进程LWP
同一进程中的线程共享相同的地址空间
Linux不区分进程,线程
通常线程指共享地址空间的多个任务
线程提高任务切换效率,避免额外TLB&cache的刷新
线程的创建
1 #include <pthread.h> 2 3 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*routine)(void *), void *arg); 4 5 //成功返回0,失败返回错误码
//错误码不可由perror打印,可由strerror打印 6 //参数: 7 // thread 线程对象 8 // attr 线程属性,NULL代表默认属性 9 // routine 函数指针--线程执行的函数 10 // arg 传递给routine的参数,参数是void* 11 12 pthread_t pthread_self(void) //参考自己的TID
测试程序:
1、创建一个线程,参考线程的tid与pid
1 #include <pthread.h> 2 #include <stdio.h> 3 #include <string.h> 4 5 void *function1(void *arg) 6 { 7 printf("this is thread function1\n"); 8 } 9 10 int main() 11 { 12 pthread_t tid; 13 int err; 14 err = pthread_create(&tid, NULL, function1, NULL); 15 if(err!=0) 16 { 17 printf("create thread: %s\n",strerror(err)); 18 return -1; 19 } 20 21 sleep(2); //主进程退出太快,会导致子线程来不及打印 22 }
通过命令行查看线程
ps -eLf | grep xxxx
线程退出
如果进程中的任意线程调用了exit
、_Exit
、_exit
函数,那么整个进程就会终止。
那如何退出线程,又不影响其他人?
1.直接返回 return
2.被其他线程取消
3.线程自己调用pthread_exit
1 #include <pthread.h> 2 void pthread_exit(void *retval); 3 4 //retval:线程结束时的返回值,可通过pthread_join接收
线程回收
1 #include <pthread.h> 2 3 int pthread_join(pthread_t pthread, void **retval); 4 5 //成功返回0,失败返回错误码 6 //thread为要回收的线程对象 7 //调用线程阻塞直到thread结束 8 //*retval接收线程thread的返回值
测试程序:
1 #include <pthread.h> 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 6 void *funct(void *arg) 7 { 8 printf("this is thread funct\n"); 9 sleep(1); 10 pthread_exit("funct exit"); 11 } 12 13 int main() 14 { 15 int re,i; 16 pthread_t tid; 17 re = pthread_create(&tid, NULL, funct, (void*)i); 18 19 void *retval; 20 pthread_join(tid, &retval); 21 printf("retval=%s\n",(char *)retval); 22 sleep(2); //主进程退出太快,会导致子线程来不及打印 23 }
取消线程
------------恢复内容结束------------
原文地址:https://www.cnblogs.com/y4247464/p/12102078.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux下安装grafana并且添加influxdb监控的方法
- 玩命学JVM:认识JVM和字节码文件
- 使用CatBoost进行不确定度估算:模型为何不确定以及如何估计不确定性水平
- 拒绝 kill -9,让 SpringBoot 优雅停机!
- SpringBoot整合Activiti7的实现代码
- Linux工具之Nethogs按进程监控网络带宽的安装部署
- 实现防重复提交和防重复点击
- Linux系统禁止root账号远程登录的命令
- 详解CentOS7 安装 MariaDB 10.2.4的方法
- linux允许端口远程访问开放端口的方法
- linux操作系统利用python实现任务管理器可视化功能
- Linux下安装PHP curl扩展的方法详解
- 各种OOM代码样例及解决方法
- Linux 中不输入密码运行 sudo 命令的方法
- Linux 查看远程服务器文件状态的方法