目录

一,线程概述

二,线程函数

1.线程的创建

2.线程的退出与回收

3.线程分离

三.程序测试


一,线程概述

线程是轻量级的进程(LWP:light weight process),在 Linux 环境下线程的本质仍是进程。在计算机上运行的程序是一组指令及指令参数的组合,指令按照既定的逻辑控制计算机运行。操作系统会以进程为单位,分配系统资源,可以这样理解,进程是资源分配的最小单位,线程是操作系统调度执行的最小单位。

二,线程函数

  • 每一个线程都有一个唯一的线程 ID,ID 类型为 pthread_t,这个 ID 是一个无符号长整形数,如果想要得到当前线程的线程 ID,可以调用如下函数:
pthread_t pthread_self(void);    // 返回当前线程的线程ID

1.线程的创建

  1. 在一个进程中调用线程创建函数,就可得到一个子线程,和进程不同,需要给每一个创建出的线程指定一个处理函数,否则这个线程无法工作。
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
  • 参数:
  • thread: 传出参数,是无符号长整形数,线程创建成功,会将线程 ID 写入到这个指针指向的内存中
  • attr: 线程的属性,一般情况下使用默认属性即可,写 NULL
  • start_routine: 函数指针,创建出的子线程的处理动作,也就是该函数在子线程中执行。
  • arg: 作为实参传递到 start_routine 指针指向的函数内部
  • 返回值:线程创建成功返回 0,创建失败返回对应的错误号

2.线程的退出与回收

  1. 在编写多线程程序的时候,如果想要让线程退出,但是不会导致虚拟地址空间的释放(针对于主线程),我们就可以调用线程库中的线程退出函数,只要调用该函数当前线程就马上退出了,并且不会影响到其他线程的正常运行,不管是在子线程或者主线程中都可以使用。
#include <pthread.h>
void pthread_exit(void *retval);
//参数:线程退出的时候携带的数据,当前子线程的主线程会得到该数据。如果不需要使用,指定为 NULL

2.

线程和进程一样,子线程退出的时候其内核资源主要由主线程回收,线程库中提供的线程回收函叫做 pthread_join(),这个函数是一个阻塞函数,如果还有子线程在运行,调用该函数就会阻塞,子线程退出函数解除阻塞进行资源的回收,函数被调用一次,只能回收一个子线程,如果有多个子线程则需要循环进行回收。

#include <pthread.h>
// 这是一个阻塞函数, 子线程在运行这个函数就阻塞
// 子线程退出, 函数解除阻塞, 回收对应的子线程资源, 类似于回收进程使用的函数 wait()
int pthread_join(pthread_t thread, void **retval);
  • 参数:
  • thread: 要被回收的子线程的线程 ID
  • retval: 二级指针,指向一级指针的地址,是一个传出参数,这个地址中存储了 pthread_exit () 传递出的数据,如果不需要这个参数,可以指定为 NULL
  • 返回值:线程回收成功返回 0,回收失败返回错误号。

3.线程分离

在某些情况下,程序中的主线程有属于自己的业务处理流程,如果让主线程负责子线程的资源回收,调用 pthread_join() 只要子线程不退出主线程就会一直被阻塞,主要线程的任务也就不能被执行了。

在线程库函数中为我们提供了线程分离函数 pthread_detach(),调用这个函数之后指定的子线程就可以和主线程分离,当子线程退出的时候,其占用的内核资源就被系统的其他进程接管并回收了。线程分离之后在主线程中使用 pthread_join() 就回收不到子线程资源了,同理主线程也就不会阻塞了。

#include <pthread.h>
// 参数就子线程的线程ID, 主线程就可以和这个子线程分离了
int pthread_detach(pthread_t thread);

三.程序测试

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>struct test{int num;int age;
};void* working(void* arg);int main()
{struct test t;//1.创建一个子线程pthread_t tid;pthread_create(&tid, NULL, working, &t);printf("子线程创建成功,ID: %ld\n", tid);printf("我是主线程, ID: %ld\n", pthread_self());for(int i = 0; i < 3; i++){printf("i = %d\n", i);}sleep(1);void* ptr;pthread_join(tid, &ptr);printf("num = %d, age = %d\n", t.num, t.age);return 0;
}void* working(void* arg)
{printf("我是子线程, ID: %ld\n", pthread_self());for(int i=0; i<9; ++i){printf("child == i: = %d\n", i);}struct test* t = (struct test*)arg;t->age = 16;t->num = 100;pthread_exit(t);// return NULL;
}

程序运行结果如下:

linux环境下的多线程编程(一)相关推荐

  1. 多线程编程之Linux环境下的多线程(三)——好文

    http://www.cnblogs.com/kuliuheng/p/4063892.html 前面两篇文章都讲述了Linux环境下的多线程编程基础知识,也附带了典型实例.本文主要比较一下Linux环 ...

  2. Linux环境下的网络编程

    本文介绍了在Linux环境下的socket编程常用函数用法及socket编程的一般规则和客户/服务器模型的编程应注意的事项和常遇问题的解决方法,并举了具体代  码实例.要理解本文所谈的技术问题需要读者 ...

  3. 南工程c语言实验报告,Linux环境下-C语言编程实验报告(1)(总4页).doc

    Linux环境下-C语言编程实验报告(1)(总4页).doc 西 安 邮 电 大 学 (计算机学院)课内实验报告实验名称 Linux环境下 C语言编程 专业名称 网络工程班 级 1203班 学生姓名 ...

  4. linux环境c语言课程设计,linux环境下c语言编程课程设计

    linux环境下c语言编程课程设计 (14页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 1/14LINUX操作系统教程课程设计题目算术 ...

  5. Linux系统下的多线程编程入门

    线程的数据处理 和进程相比,线程的最大优点之一是数据的共享性,各个进程共享父进程处沿袭的数据段,可以方便的获得.修改数据.但这也给多线程编程带来了许多问题.我们必须当心有多个不同的进程访问相同的变量. ...

  6. Linux操作系统下的多线程编程详细解析----条件变量pthread_cond_t那些事儿

    推荐两个博文: http://www.cnblogs.com/Creator/archive/2012/04/18/2455584.html http://blog.csdn.net/sunboy_2 ...

  7. Linux环境下的Qt5编程(闹钟)

    Qt安装部分参考 http://t.csdn.cn/iTjDP 后半部分参考博主 http://t.csdn.cn/ysdRm http://t.csdn.cn/Dy5Z7 感谢!!! 一.Qt介绍 ...

  8. linux环境下的c编程指南,C语言Socket简单编程指南PDF

    1.介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措? ...

  9. Linux环境下,网络编程基础概念(仅学习笔记)

    网络编程 进程间通讯IPC各种手段,都是在同一台机器上. 不同计算机通过网络链接上进程相互通讯的机制:网络进程间通讯 network IPC 1)Internet的历史 Internet-" ...

  10. Linux操作系统下的多线程编程详细解析----条件变量

    条件变量通过允许线程阻塞和等待另一个线程发送信号的方法,弥补了互斥锁(Mutex)的不足. 1.初始化条件变量pthread_cond_init #include <pthread.h> ...

最新文章

  1. 设计模式之不简单的工厂模式(一)
  2. shell数组使用技巧
  3. 第五节 系统调用的三个层次(下) ——20135203齐岳
  4. php 抓取天气情况 www.weather.com.cn
  5. 标志寄存器02 - 零基础入门学习汇编语言55
  6. 汇编程序基本结构+利用DOS系统编译连接汇编程序
  7. BackgroundWorker使用总结
  8. java messagedigest,在C#中的Java MessageDigest类
  9. Virtual KD 出现 Still cannot find RPC dispatcher table 无法连接
  10. 计算文件的md5值(Vue)
  11. Sumatra PDF阅读器之 Sumatra PDF 高级设置
  12. linux如何输入命令,linux中的命令如何输入
  13. 算法:一个小人通过有鳄鱼的河
  14. 在postfix使用qq企业邮箱的smtp
  15. zbb20180921 spring事物的七种事物传播属性行为及五种隔离级别
  16. 智慧消防 物联网网关用于防火监测系统
  17. Node.js fs模块 删除非空目录
  18. 燃气爆炸竟然是这个四个原因?
  19. 2022安全员-C证特种作业证考试题库及答案
  20. 基于PaddleDetection的行车检测

热门文章

  1. tomcat7下载安装
  2. Git可视化工具-小乌龟
  3. 尚硅谷大数据技术之 DataX—1)概述
  4. sonar 加载mysql_sonar安装配置
  5. MOT多目标跟踪之JDE
  6. 手机木马以及移动安全
  7. 转载visio 绘图矢量图素材网站
  8. matlab dbc文件,一种EXCEL转DBC文件的生成方法及装置与流程
  9. python黑帽子学习中的疑难-(一)取代netcat
  10. 计算机释放内存的命令,如何设置电脑Win7自动释放内存空间?