《Linux 应用编程》—第13章 Linux 多线程编程

目录

  • 多线程概述

    • 什么是线程
    • 线程与进程的关系
    • 为什么使用多线程
  • POSIX Threads 概述
  • 线程管理
    • 线程ID
    • 创建与终止
      • 创建线程
      • 终止线程
      • 线程范例1
    • 连接与分离
      • 线程分离
      • 线程连接
      • 线程范例2
    • 线程属性
      • 属性对象
      • 线程状态
      • 线程栈
      • 线程范例3
  • 线程安全
  • 互斥量
  • 条件变量

多线程概述

什么是线程

线程是进程内的顺序执行流,一个进程中可以并发多条线程,每条线程并行执行不同的任务。

线程与进程的关系

  • 一个线程只能属于一个进程,一个进程可以包含多个线程,但是至少有一个主线程
  • 资源分配给进程,同一进程的所有线程共享该进程的所有资源
  • 线程作为调度和分配的基本单位,进程作为拥有资源的基本单位(这里说的是操作系统资源吧)
  • 在创建或撤销进程时,由于系统都要为之分配和回收资源,导致系统的开销大于创建或撤销线程时的开销(也就是说创建或撤销进程包含创建或撤销线程,同时还有分配和回收资源)

小声bb:在FreeRTOS等小型操作系统,或者说是任务调度微内核里面好像没有进程的概念.

引用"阮一峰"的博客内容

CPU:工厂; 假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。

进程:车间; 进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。

一个车间里,可以有很多工人。他们协同完成一个任务。

线程:工人; 线程就好比车间里的工人。一个进程可以包括多个线程。

车间的空间是工人们共享的,比如许多房间(内存空间)是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存

可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。

一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁"(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。

还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。

时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做"信号量"(Semaphore),用来保证多个线程不会互相冲突。

不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。

为什么使用多线程

  • 方便通信和数据交换

    线程间有方便的通信和数据交换机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。

  • 更高效的利用CPU

    使用多线程可以提高应用程序响应(说明多线程也是轮转的)。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作置于一个新的线程,可以避免这种尴尬的情况。

POSIX Threads 概述

POSIX Threads(通常简称为 Pthreads)定义了创建和操纵线程的一套 API 接口, 一般用于 Unix-like POSIX 系统中(如 FreeBSD、 GNU/Linux、 OpenBSD、 Mac OS 等系统)。

Pthreads接口根据功能划分:

  • 线程管理
  • 互斥量
  • 条件变量
  • 同步

写Pthreads多线程程序的时远源码需要包含pthread.h头文件,LDFLAGS += -pthread,可以用来指定需要包含的库。Makefile 选项 CFLAGS 、LDFLAGS 、LIBS可以了解一下。

线程管理

待总结

线程ID

定义:可以看做是线程的句柄,用来引用一个线程

  • pthread_self()函数

    • 作用:获取线程自己的ID
    • 返回值:pthread_t
    • 形参:void
  • pthread_equal函数
    • 作用:比较两个线程ID是否相等
    • 返回值:相等返回非0值,否则返回0
    • 形参:pthread_t类型的两个参数

创建与终止

创建线程

终止线程

线程范例1

连接与分离

线程分离

线程连接

线程范例2

线程属性

属性对象

线程状态

线程栈

线程范例3

线程安全

待总结

互斥量

待总结

条件变量

待总结

原文地址:https://www.cnblogs.com/dluff/p/12355325.html

时间: 2024-10-16 14:56:05

《Linux 应用编程》—第13章 Linux 多线程编程的相关文章

第13章 Linux的网络管理

本文目录: 13.1 Linux数据包转发功能 13.2 和网络相关的几个文件说明 13.2.1 网卡配置文件ifcfg-* 13.2.2 DNS配置文件/etc/resolve.conf 13.2.3 /etc/udev/rules.d/70-persistent-net.rules 13.2.4 /etc/services 13.3 网络接口配置和主机名 13.3.1 ifconfig 13.3.2 ifcfg 13.3.3 hostname命令 13.4 网关/路由 13.4.1 rout

第13章 linux系统管理技巧(日常运维管理技巧)

这一章的内容是核心,以后会用的几率也是很大的,只要掌握必备的基础知识,做初级系统管理员是不成问题的. 13.1监控系统的状态 作为一个运维工程师.系统管理员,如果对自己的系统不了解的话,那怎么排查问题呢?如果出现问题的话,肯定要查一下是什么问题,哪里的问题,系统的资源的耗费情况如何查看. 13.1.1使用w命令查看当前系统的负载 第一部分是系统时间,使用date命令也可以查看当前时间. 第二部分是系统运行时间 第三部分是登陆了几个用户,从下面可以看到,也可以看到登录了哪个终端.如果是网络登录的话

《鸟哥的Linux私房菜》13章shel script习题答案

因为感觉对Linux命令还没有多大的感觉,所以就专门找了鸟哥的书来看一下,折腾了几天看基础篇的shell部分,收获还是蛮大的,至少对Linux命令是有点感觉了,然后往前学习的一些知识,在理论知识方面也得到了一定的扩充了.先不多说,把习题的答案分享一下. <鸟哥的Linux私房菜>基础篇P398习题 (1)请新建一个script,当你执行该script的时候,该script可以显示你目前的身份(用whoami)和你目前所在的目录(用pwd). 这道题的答案已经直接给出了,直接上脚本: #!/bi

第13章 Linux日志管理

1. 日志管理 (1)简介 在CentOS 6.x中日志服务己经由rsyslogd取代了原先的syslogd服务.rsyslogd日志服务更加先进,功能更多.但是不论该服务的使用,还是日志文件的格式其实都是和syslogd相兼容的. (2)rsyslogd的新特点 ①基于TCP网络协议传输日志信息 ②更安全的网络传输方式 ③有日志消息的及时分析框架 ④后台数据库 ⑤配置文件中可以写简单的逻辑判断. ⑥与syslogd配置文件相兼容 (3)查看rsyslogd服务是否启动: ①#ps aux |

拜师鸟哥之linux学习体会(13)——linux账号管理与ACL权限设定

1.    这一章主要介绍linux的相关用户账号管理.每个登陆者至少都会取得两个ID,一个是使用者ID(User ID,UID),一个是群组ID(group ID,GID). 2.    当你输入账号和密码时,系统帮你做了什么呢? 1)先找寻/etc/passd里面是否有你的输入账号,若没有就跳出,如有则将该账号对应的UID和GID读出来,另外该账号家目录与shell设定也一并读出 2)核对密码表.这时Linux会进入/etc/shadow里面找出对应的账号与UID,然后核对一下你刚输入的密码

Linux学习笔记 第五章Linux首次登陆与在线求助 man page

 X Window与命令行模式的切换   1. 通常我们也称命令行模式为终端界面(terminal或console). Linux默认的情况下会提供6个Terminal来让用户登录,切换的方式为使用[Ctrl]+[Alt]+[F1]~[F6]的组合按钮. 2.系统会将[F1]~[F6]命名为tty1~tty6的操作界面环境. 3.切换到X Window窗口界面[Ctrl]+[Alt]+[F7]就可以了. 1~3总结: [Ctrl]+[Alt]+[F1]~[F6]:文字界面登录tty1~tty6终

《鸟哥的Linux私房菜》7章 Linux文件与目录管理 习题答案

自己整理了一下,分享给大家,这些习题确实是非常经典的! 1.什么是绝对路径与相对路径? 绝对路径是相对于/目录的路径的,比如/home/user: 相对路径是相对于当前工作目录的,比如你的系统上有个/home/user/test目录,此时你在/home/user目录下,那么./test就是相对路径. 2.如何更改一个目录的名称?例如/home/test变为/home/test2. mv /home/test /home/test2 3.PATH这个环境变量的意义是什么? 这里先看一下PATH:

第13章 MySQL高级编程

1.事务:一个或一系列的查询: 2.使用事务安全的表格类型(通过InnoDB): ①关闭自动提交: set autocommit=0; //若自动提交被打开,须使用如下语句开始一个事务: //  start transaction;  若自动提交是关闭的则不需要此句 ②完成组成事务的语句输入后,提交给数据库:  commit; ③回到数据库之前的状态:  rollback; ④将表格转换成InnoDB表格(之前是MyISAM表格): alter table orders type=innodb;

Linux 的多线程编程的高效开发经验(转)

http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/ 背景 Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们从 5 个方面总结出 Linux 多线程编程上的问题,并分别引出相关改善的开发经验,用以避免这些的陷阱.我们希望这些经验可以帮助读者们能更好更快的熟悉 Linux 平台的多线程