线程一章通读

2024-02-03 14:48
文章标签 线程 通读 一章

本文主要是介绍线程一章通读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇和上篇一样,侧重了解作者的思路,设计方式,而不仅仅单纯的了解这些知识,当然,本次学习中,了解本章的知识也是一个目的之一,毕竟,对这一方面的内容还不算炉火纯青。

在本章的前导言中,对线程的概念作了较详细的解释,以及与进程的区别。我们在这里整理一下:
1.线程是允许一个程序执行不止一个的任务,而且看起来是并行运行。
2.进程运行时,至少创建一个线程。不同线程执行的是同一程序的不同部分。
3.子进程是从父进程那里复制虚拟内存,文件描述符,而线程是共享内存空间,文件描述符等。
4.一个进程中所有的线程都是执行统一程序,但是如果任何一个exec,所有其他线程就此中止。
5.用-lpthread保证连接
我个人认为:在原理上让初学者理解这么多,还是很有困难的。作者的构思上应该主要是与上一章对应。

下面本章的内容分成六节:1线程的创建,2线程的取消,3线程的专有数据,4同步和临界区,5GNU/Linux的线程实现,6进程和线程的比较。内容的安排上来看,重点或者常用的部分肯定在1和4节上。前面四节介绍具体的内容,后面两节转向总结。

第一节 线程的创建
前面的引子,后面分成a给线程传递数据,b等待线程,c线程的返回值,d线程id,e线程的属性
这样几个小节来介绍,我们逐细来看:
引子:
1.线程id来标志类型,c/c++中,为pthread_t
2.创建线程时,指定一个普通的函数,个人觉得这里,应该引入函数的声明,更方便说明。而且,这个函数的指针是否应该是对C语言学习者的一个很好的复习的例子。
3.作者在这里实际上详细的介绍了各个参数,和K&R的风格基本一致。
4.继续强调线程间的调度是异步调度,所以不能依赖于他们的先后关系。并引用实例说明。
个人觉得如果对操作系统的理解足够好的话,实验可简单安排,反之,可能从让学生来理解操作系统的一些原理。
5最后提到了线程的退出方式。这里可能可以重新开一个小的标题.

a向线程传递数据
原则上,我个人认为这里相对比较简单。可能基于以下两个原因
对C语言学生的复习,可能更多的学生还没有理解如何给一个函数指针传递参数的方式,其实在第五章系统接口的时候已经提到过。
第二个原因就是针对:实例引出问题,所以,承上启下。这和K&R的风格也算一致。

b线程的等待
用wait来对比于同样的操作,个人认为,也是应该先给出需要应用函数的生命在前面,这和K&R,Robbins的风格会一致。
然后重写上面的实例,给出本实例的教训或者目的。似乎这里应该强调一下主线程的概念。

c线程的返回值
这里给出一个例子,主线程要等待某个线程的返回值。这个可能有一些特别的应用,或许对多核的编程有借鉴意义。可能这里可以复习C语言的强制类型转换的概念。

d关于线程ID
一样,就是要添加这里用到的函数的声明。pthread_self,和pthread_equal
可以让学生实验一下线程等待自己结束是导致死锁还是返回错误代码。

e线程属性
继续保持原有的风格,对pthread_attr_t的数据结构或者是对pthread_attr_init,pthread_attr_destroy,pthread_attr_getdetachstate,pthread_detach的函数加以声明。

总结第一节来看,作者们表述的内容也应该相当齐整。我们只需要在格式上稍作变化即可。重点应该安排在实验上,让初学者有亲切体会。

第二节线程的取消,包含引子,a同步和异步线程,b不可取消的临界区,c何时使用线程取消
看引子,一样,我们需要先添加函数的声明。

线程是否可以取消取决于三种情况:
线程可以被一部取消
线程可以被同步取消
线程不可被取消
当一个线程刚被建立的时候,处在可被同步取消。

a同步和异步线程
同前面一样,要把pthread_setcanceltype等api先声明了。
可异步取消的线程可以在任意时刻取消,同步取消的线程只能在特殊位置取消,引入取消点的概念。并且还有直接取消点和间接取消点。这部分内容到现在也可能没有几个人了解。

b不可取消的临界区
一样介绍函数的声明,提出临界区这个大家都很熟悉的概念。以一个现实中最重要的例子银行系统说明。
c何时应该取消线程?
原则上取消线程不是一个很好的策略。

第三节线程专有数据
进程间线程的是共享数据空间的,但是每个线程还是有自己单独的调用栈。
如果要把线程中的一个变量的复制给每个线程,Linux给每个线程提供一个线程专有数据区。
c清理句柄
添加函数声明:pthread_cleanup_push,pthread_cleanup_pop
清理函数为了防止线程退出或者被取消的时候出现资源泄漏的问题。但有时需要创建清理函数但是却不希望有专有数据对象。清理句柄:当一个线程退出时被自动调用的函数。在线程被取消或者是中途退出时被调用。
C++清理方法。

第四节同步和临界代码段
首先从并行程序和异步调度来说明。调试中复现的困难。因为共享数据所以相互竞争的概念。
分a竞争状态,b互斥体,c互斥体死锁,d非阻塞互斥体测试,e线程信号量,f条件变量,g多个线程的死锁。这部分内容应该是这一章的重点。
a竞争条件,
这也是一个很好的说明并行性的例子。可以在操作系统原理中把这个例子引入。
这里也引入了原子操作的问题,不知道操作系统里会不会讲到。

b互斥体
函数的声明和数据结构的声明
这里,我认为应该指出:原子操作的不可行性。
其他的主要就是在引用实例。从写作的手段来看,基本上符合K&R的标准范式。

c互斥体死锁
一样的把本节用到的类型,函数进行声明。
三种互斥体:
快速,默认的mutex.
递归mutex:
纠错检测的mutex:
涉及到mutex的attribute问题。

d非阻塞互斥体测试
也就是trylock系列的函数。

e线程信号量
两种,一种是处理线程,一种是处理进程的。
觉得这里的例子也很好,一步步地深入地学习。而不是另起炉灶。

f条件变量
看来这一节我自己也还要好好的看看,都不记得怎么操作了,自己的阅读了这一节,大概弄清楚了,这里的例子还是很清楚的说明了这个问题。
我们还是要在每一节的头上把用到的函数,变量的类型加上。
这里的重点在于,如果已经设置,就不用等待,丢弃信号,如果没有设置,就等待,但是可以被信号唤醒。个人觉得这一节的论述比较啰嗦,不似作者风格。

g发生死锁
简单的介绍了死锁得发生情况,确切地说应该引入一个思想:
在共享资源的时候,很容易遇到死锁的情况,线程是共享进程内的资源,而操作系统确实多进程的又共享的硬件资源,所以,更容易出现死锁,所以花大量的篇幅再将并行性问题。

第五节:GNU/Linux的线程实现
这个实例揭示了linux系统上线程的实质---LWP。以及涉及内容:a信号处理,bclone的系统调用
a信号处理,进程间的信号有主线程处理,而线程之间也可以发信号。
bclone的系统调用,这里应该是说pthread是如何实现共享的,而不是拥有独立副本。

第六节就是讲进程和线程的区别
优势劣势,以及怎么样的选择。

通篇来说,浅显易懂是我们的准则。最后一节和开篇从不同的角度阐述进程与线程的不同
这里看起来,对线程的描述应该相当完整。我建议还是把我们的大纲完全按照这个顺序来执行。

这篇关于线程一章通读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/674491

相关文章

Java线程面试题(50)

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。 在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程,

线程池ThreadPoolExecutor类源码分析

Java并发编程:线程池的使用   在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:   如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。   那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?

线程Lock

线程Lock   在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。   也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文先从s

线程封装,互斥

文章目录 线程封装线程互斥加锁、解锁认识接口解决问题理解锁 线程封装 C/C++代码混编引起的问题 此处pthread_create函数要求传入参数为void * func(void * )类型,按理来说ThreadRoutine满足,但是 这是在内类完成封装,所以ThreadRoutine函数实际是两个参数,第一个参数Thread* this不显示 解决方法: 第

Linux-笔记 线程同步机制

目录 前言 实现 信号量(Semaphore) 计数型信号量 二值信号量  信号量的原语操作 无名信号量的操作函数 例子 互斥锁(mutex) 互斥锁的操作函数 例子 自旋锁 (Spinlock) 自旋锁与互斥锁的区别 自旋锁的操作函数 例子 前言         线程同步是为了对共享资源的访问进行保护,确保数据的一致性,由于进程中会有多个线程的存在,

jmeter之Thread Group(线程组)

Thread Group(线程组) 1.线程组,或者可以叫用户组,进行性能测试时的用户资源池。 2.是任何一个测试计划执行的开始点。 3.上一篇提到的“控制器”和“HTTP请求”(采集器)必须在线程组内;监听器等其他组件,可以直接放在测试计划下。 线程组设置参数的意义 我们以下图为例,进行详细说明。见下图:  区域1(在取样器错误后要执行的动作) 这个区域的主要作用很明显,在线程内

如何在Android中实现多线程与线程池?

目录 一、Android介绍二、什么是多线程三、什么是线程池四、如何在Android中实现多线程与线程池 一、Android介绍 Android是一种基于Linux内核的开源操作系统,由Google公司领导开发。它最初于2007年发布,旨在为移动设备提供一种统一、可扩展的操作系统。Android系统以其高度的可定制性和丰富的应用生态而受到广泛欢迎,如今已经成为全球最流行的

线程间通信方式(互斥(互斥锁)与同步(无名信号量、条件变量))

1通信机制:互斥与同步 线程的互斥通过线程的互斥锁完成; 线程的同步通过无名信号量或者条件变量完成。 2  互斥 2.1 何为互斥?         互斥是在多个线程在访问同一个全局变量的时候,先让这个线程争抢锁的资源,那个线程争抢到资源,它可以访问这个变量,没有争抢到资源的线程不能够访问这个变量。那这种只有一个线程能够访问到这个变量的现象称之为线程间互斥。 2.2互斥锁API 1.

线程C++

#include <thread>#include <chrono>#include <cmath>#include <mutex>#include <iostream>using namespace std;mutex mtx;void threadCommunicat(){int ans = 0;while (ans<=3){mtx.lock();//上锁cout << "a

线程知识点(一)

文章目录 一、线程是什么?二、进程与线程的关系三、种类内核级线程用户级线程混合型线程 总结 一、线程是什么? 线程是程序最基本的运行单位,真正运行的是进程中的线程。 线程是大多数操作系统支持的调度单位, 执行单元,某些系统不支持线程技术。 是允许应用程序并发执行多个任务的一种机制,同一程序中的所有线程均会独立执行相同程序。 共享同一份全局内存区域,其中包据初始化数据段、未初