linux多线程——基础知识+实现
在Linux中利用C语言实现多线程。利用函数pthread_create()、pthread_exit()、pthread_join()。
一、pthread_create()
#include <pthread.h>
int pthread_create(pthread_t *restrict tidp, //新创建的线程指向的内存单元。const pthread_attr_t *restrict attr, //线程属性,默认为NULLvoid *(*start_rtn)(void *), //新创建的线程从start_rtn函数的地址开始运行void *restrict arg //默认为NULL。若上述函数需要参数,将参数放入结构中并将地址作为arg传入。);
二、pthread_exit()
void pthread_exit(void *retval);线程退出,并可以设置返回的状态码。
return、exit、pthread_exit的功能不一样:
1.pthread_exit()用于线程退出,可以指定返回值,以便其他线程通过pthread_join()函数获取该线程的返回值
2.return,是函数返回,不一定是线程函数哦! 只有线程函数return,线程才会退出
3.exit()是进程退出,如果在线程函数中调用exit,那改线程的进程也就挂了,会导致该线程所在进程的其他线程也挂掉。
三、pthread_join()
pthread_join()方法后面的代码,只有等到子线程结束了才能执行。
int pthread_join(pthread_t tid, //需要等待的线程,指定的线程必须位于当前的进程中,而且不得是分离线程void **status //线程tid所执行的函数返回值(返回值地址需要保证有效),其中status可以为NULL);
四、多线程例子
4.1 第一个例子
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<unistd.h>void *func0()
{printf("this is thread0\n");pthread_exit((void *)0); //退出线程并返回状态码
}void *func1()
{printf("this is thread1\n");pthread_exit((void *)1);
}int main()
{int err;pthread_t tid0,tid1;void *ret;err=pthread_create(&tid0,NULL,func0,NULL); //创建一个线程叫线程号为tid0if(err){printf("error");exit(1);}err=pthread_create(&tid1,NULL,func1,NULL);//创建一个线程叫线程号为tid1if(err){printf("error");exit(2);}err=pthread_join(tid0,&ret);//阻塞进程,等待func1执行完if(err){printf("eror");exit(1);}printf("tid0 code:%ld\n",(long)ret);err=pthread_join(tid1,&ret); //阻塞进程,等待func1执行完if(err){printf("dw");exit(1);}printf("tid1 code :%ld\n",(long)ret);exit(0);
}
利用命令gcc thread_join.c -o main -lpthread(这个必须加)。
./main执行结果如下。
可以看到,线程都正常运行结束,并且返回的状态码进程也捕获到了。
4.2 第二个例子
证明线程是运行在同一个父进程下的。
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
void *func();
void printtid(char *s);
void printtid(char *s)
{pthread_t tid;pid_t pid;pid=getpid();tid=pthread_self();printf("%s:pid=%10d tid=%ld\n",s,pid,tid);
}void *func()
{printtid("child0");pthread_exit(NULL);
}
void *func1()
{printtid("child1");pthread_exit(NULL);
}
int main()
{int err;pthread_t tid0,tid1;err=pthread_create(&tid0,NULL,func,NULL);if(err){printf("eror");exit(1);}err=pthread_create(&tid1,NULL,func1,NULL);if(err){printf("eror");exit(1);}printtid("main");sleep(1); //等一秒,这里没使用pthread_join,防止没执行线程直接退出。exit(0);
}
执行效果如下:可以看到所有线程的进程号都是相同的,所以说明他们是同一个进程下的不同线程。
linux多线程——基础知识+实现相关推荐
- 权限认证php,2016年Linux认证基础知识:php做权限管理
2016年Linux认证基础知识:php做权限管理 在学习Linux认证过程中,每个人会遇到每个人不同的问题,或小或大,那么你知道在Linux下,php怎么做权限管理?下面跟yjbys小编来看看最新的 ...
- Linux系统基础知识
Linux系统基础知识 1.在Linux系统中,以文件方式访问设备. 2. Linux内核引导时,从文件 /etc/fstab中读取要加载的文件系统. 3. Linux文件系统中每个文件用 ino ...
- Kali Linux渗透基础知识整理(四):维持访问
Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...
- Linux操作系统基础知识学习
Q1.什么是GNU?Linux与GNU有什么关系? A: 1)GNU是GNU is Not Unix的递归缩写,是自由软件基金会(Free Software Foundation,FSF)的一个项目, ...
- Java多线程基础知识
多线程基础知识 这是我再次学习多线程知识的一个总结,对于刚刚接触的学习者是比较友好易懂的,便于快速的理解和掌握. 一.基本概念: 1.进程:进程就是运行中的程序,当一个程序开始执行,操作系统就会给这个 ...
- Linux常用基础知识必备三之常用指令及操作
Linux常用基础知识必备三之常用指令及操作 1.vi和vim vi如何使用 vi几种模式下的操作指令 命令模式进入编辑模式 命令模式下的快捷键 底行模式(指按了esc键之后输入按键:后出现) 字符串 ...
- linux系统下io的过程,Linux系统基础知识:IO调度
Linux系统基础知识:IO调度 IO调度发生在Linux内核的IO调度层.这个层次是针对Linux的整体IO层次体系来说的.从read()或者write()系统调用的角度来说,Linux整体IO体系 ...
- Linux入门基础知识
注:内容系兄弟连Linux教程(百度传课:史上最牛的Linux视频教程)的学习笔记. Linux入门基础知识 1. Unix和Linux发展历史 二者就像父子关系,当然Unix是老爹.1965年,MI ...
- Linux驱动 简单的Linux驱动基础知识
Linux驱动 简单的Linux驱动基础知识 一.简述 记--Linux驱动学习笔记. Linux驱动程序初始化硬件设备,并提供硬件控制接口给更上一层的应用调用. 例如使用QT应用程序 ...
最新文章
- ren`guang-boss面试
- 手机被偷后如何让小偷不能用
- react 拖拽生成html,[React] 基于react 拖拽时间选择器
- qt爬取网页信息_豆瓣TOP250数据爬取
- 转:android 避免内存泄露
- php公众号客服消息图文,微信公众号开发系列-发送客服消息(示例代码)
- worknc的后处理如何安装_这些压缩空气后处理问题,大部分人都没有关注到
- Linux 搭建PHP环境
- JavaScript学习(七十五)—图解浅拷贝和深拷贝
- c++树及树与二叉树的转换
- 软件研发管理体系建设
- Vivado下的仿真入门
- jis拉伸试棒图纸_拉力测试棒测试(拉伸试验试棒尺寸)
- java中前加加和后加加(精彩案例)
- php 时分秒选择联动,jquery.datepair日期时分秒选择器
- Hadoop之——基于3台服务器搭建Hadoop3.x集群(实测完整版)
- Android 软件平台架构设计
- celery beat一直不触发任务(卡在Writing entries...)
- 如何解决端口被占用的问题
- python实现多张多格式图片转PDF并打包成exe
热门文章
- 树莓派摄像头安装教程!超详细!
- TCP滑动窗口模拟实战
- Python实现部分主元法下LU分解
- 6大常用数据分析模型详解
- 前端进阶_狂神Vue笔记_语法指令v-bind、v-on、v-for_表单双绑_组件_Axios异步通信_Vue的生命周期_计算属性_插槽 <slot>_webpack使用_vue-router路由
- 设计模式-结构模式-装饰器模式 decorater
- 乐华阅卷系统打不开服务器,乐华网上阅卷系统1.0操作手册.docx
- Unity3D研究院之在Unity中打开第三方数据库配合Android开发(三十二)
- 验证哥德巴赫猜想之一—— 2000以内的正偶数(c作业)
- 2021遥感应用组二等奖:基于长时序Landsat遥感影像的赣南脐橙时空变化分析