在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多线程——基础知识+实现相关推荐

  1. 权限认证php,2016年Linux认证基础知识:php做权限管理

    2016年Linux认证基础知识:php做权限管理 在学习Linux认证过程中,每个人会遇到每个人不同的问题,或小或大,那么你知道在Linux下,php怎么做权限管理?下面跟yjbys小编来看看最新的 ...

  2. Linux系统基础知识

    Linux系统基础知识 1.在Linux系统中,以文件方式访问设备.   2. Linux内核引导时,从文件 /etc/fstab中读取要加载的文件系统. 3. Linux文件系统中每个文件用 ino ...

  3. Kali Linux渗透基础知识整理(四):维持访问

    Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...

  4. Linux操作系统基础知识学习

    Q1.什么是GNU?Linux与GNU有什么关系? A: 1)GNU是GNU is Not Unix的递归缩写,是自由软件基金会(Free Software Foundation,FSF)的一个项目, ...

  5. Java多线程基础知识

    多线程基础知识 这是我再次学习多线程知识的一个总结,对于刚刚接触的学习者是比较友好易懂的,便于快速的理解和掌握. 一.基本概念: 1.进程:进程就是运行中的程序,当一个程序开始执行,操作系统就会给这个 ...

  6. Linux常用基础知识必备三之常用指令及操作

    Linux常用基础知识必备三之常用指令及操作 1.vi和vim vi如何使用 vi几种模式下的操作指令 命令模式进入编辑模式 命令模式下的快捷键 底行模式(指按了esc键之后输入按键:后出现) 字符串 ...

  7. linux系统下io的过程,Linux系统基础知识:IO调度

    Linux系统基础知识:IO调度 IO调度发生在Linux内核的IO调度层.这个层次是针对Linux的整体IO层次体系来说的.从read()或者write()系统调用的角度来说,Linux整体IO体系 ...

  8. Linux入门基础知识

    注:内容系兄弟连Linux教程(百度传课:史上最牛的Linux视频教程)的学习笔记. Linux入门基础知识 1. Unix和Linux发展历史 二者就像父子关系,当然Unix是老爹.1965年,MI ...

  9. Linux驱动 简单的Linux驱动基础知识

    Linux驱动 简单的Linux驱动基础知识 一.简述         记--Linux驱动学习笔记. Linux驱动程序初始化硬件设备,并提供硬件控制接口给更上一层的应用调用. 例如使用QT应用程序 ...

最新文章

  1. ren`guang-boss面试
  2. 手机被偷后如何让小偷不能用
  3. react 拖拽生成html,[React] 基于react 拖拽时间选择器
  4. qt爬取网页信息_豆瓣TOP250数据爬取
  5. 转:android 避免内存泄露
  6. php公众号客服消息图文,微信公众号开发系列-发送客服消息(示例代码)
  7. worknc的后处理如何安装_这些压缩空气后处理问题,大部分人都没有关注到
  8. Linux 搭建PHP环境
  9. JavaScript学习(七十五)—图解浅拷贝和深拷贝
  10. c++树及树与二叉树的转换
  11. 软件研发管理体系建设
  12. Vivado下的仿真入门
  13. jis拉伸试棒图纸_拉力测试棒测试(拉伸试验试棒尺寸)
  14. java中前加加和后加加(精彩案例)
  15. php 时分秒选择联动,jquery.datepair日期时分秒选择器
  16. Hadoop之——基于3台服务器搭建Hadoop3.x集群(实测完整版)
  17. Android 软件平台架构设计
  18. celery beat一直不触发任务(卡在Writing entries...)
  19. 如何解决端口被占用的问题
  20. python实现多张多格式图片转PDF并打包成exe

热门文章

  1. 树莓派摄像头安装教程!超详细!
  2. TCP滑动窗口模拟实战
  3. Python实现部分主元法下LU分解
  4. 6大常用数据分析模型详解
  5. 前端进阶_狂神Vue笔记_语法指令v-bind、v-on、v-for_表单双绑_组件_Axios异步通信_Vue的生命周期_计算属性_插槽 <slot>_webpack使用_vue-router路由
  6. 设计模式-结构模式-装饰器模式 decorater
  7. 乐华阅卷系统打不开服务器,乐华网上阅卷系统1.0操作手册.docx
  8. Unity3D研究院之在Unity中打开第三方数据库配合Android开发(三十二)
  9. 验证哥德巴赫猜想之一—— 2000以内的正偶数(c作业)
  10. 2021遥感应用组二等奖:基于长时序Landsat遥感影像的赣南脐橙时空变化分析