首页 > 其他分享 >学习笔记7

学习笔记7

时间:2023-10-28 19:13:33浏览次数:38  
标签:attr 笔记 学习 互斥 死锁 线程 pthread 进程

并发编程

线程

  1. 原理:一个操作系统(OS)包含许多并发进程。在进程模型中,进程是独立的执行单元。线程是某进程同一地址空间上的独立执行单元。创建某个进程就是在一个唯一地址空间创建一个主线程。当某进程开始时,就会执行该进程的主线程。如果只有一个主线程,那么进程和线程实际上并没有区别。但是,主线程可能会创建其他线程。每个线程又可以创建更多的线程等。某进程的所有线程都在该进程的相同地址空间中执行,但每个线程都是一个独立的执行单元。在线程模型中,如果一个线程被挂起,其他线程可以继续执行。除了共享共同的地址空间之外,线程还共享进程的许多其他资源,如用户id、打开的文件描述符和信号等。
  2. 优点:
  • 线程创建和切换速度更快
  • 线程的响应速度更快
  • 线程更适合并行计算
  1. 缺点:
  • 需要来自用户的明确同步
  • 许多库函数可能对线程不安全
  • 在单CPU系统上,使用线程解决问题实际上要比使用顺序程序慢
  1. 创建线程
    使用pthread_create()函数创建线程。
    int pthread_create (pthread_t *pthread_id, pthread_attr_t *attr, void *(*func) (void *) , void *arg) ;
    如果成功则返回0,如果失败则返回错误代码。pthread_create()函数的参数为
  • pthread_id 是指向pthread_t类型变量的指针。它会被操作系统内核分配的唯一线程 ID 填充。在POSIX中,pthread_t是一种不透明的类型。程序员应该不知道不透明对象的内容,因为它可能取决于实现情况。线程可通过pthread_self(函数获得自己的ID。在Linux中,pthread_t类型被定义为无符号长整型,因此线程ID可以打印为%lu。
  • attr 是指向另一种不透明数据类型的指针,它指定线程属性,下面将对此进行更详细的说明。
  • func 是要执行的新线程函数的入口地址。·arg 是指向线程函数参数的指针,可写为: void *func (void *arg)
    其中,
  • attr参数最复杂。下面给出了attr参数的使用步骤。
    (1)定义一个pthread 属性变量pthread_attr_t attro。
    (2)用pthread_attr_init (&attr)初始化属性变量。
    (3)设置属性变量并在pthread_create()调用中使用。
    (4)必要时,通过pthread_attr_destroy (&attr)释放attr 资源。
    下面列出了使用属性参数的一些示例。每个线程在创建时都默认可与其他线程连接。必要时,可使用分离属性创建一个线程,使它不能与其他线程连接。
  1. 线程ID
    线程ID是一种不透明的数据类型,取决于实现情况。因此,不应该直接比较线程ID。如果需要,可以使用pthread_equal()函数对它们进行比较。
    int pthread_equal (pthread_t t1, pthread_t t2);
    如果是不同的线程,则返回0,否则返回非0。
  2. 线程终止
    线程函数结束后,线程即终止。或者,线程可以调用函数
    int pthread_exit(void *status);
    进行显式终止,其中状态是线程的退出状态。通常,0退出值表示正常终止,非0值表示异常终止。
  3. 线程连接
    一个线程可以等待另一个线程的终止,通过:
    int pthread_join (pthread_t thread, void **status_ptr);
    终止线程的退出状态以status_ptr 返回。

线程同步

由于线程在进程的同一地址空间中执行,它们共享同一地址空间中的所有全局变量和数据结构。当多个线程试图修改同一共享变量或数据结构时,如果修改结果取决于线程的执行顺序,则称之为竞态条件。在并发程序中,绝不能有竞态条件。否则,结果可能不一致。

  1. 互斥量:
    最简单的同步工具是锁,它允许执行实体仅在有锁的情况下才能继续执行。在Pthread中,锁被称为互斥量,意思是相互排斥。互斥变量是用pthread_mutex_t类型声明的,在使用之前必须对它们进行初始化。有两种方法可以初始化互斥量。
    (1)一种是静态方法,如:
    pthread_mutex_tm=PTHREA D_MUTEX_INITIALIZER;
    定义互斥量m,并使用默认属性对其进行初始化。
    (2)另一种是动态方法,使月月pthread_mutex_init()函数,可通过attr参数设置互斥属性,如:
    pthread_mutex_init(pthread_mu tex_t *m, pthread_mutexattr_t,*attr);
    通常,attr参数可以设置为NULL,作为默认属性。
  2. 死锁预防
    互斥量使用封锁协议。如果某线程不能获取互斥量,就会被阻塞,等待互斥量解锁后再继续。在任何封锁协议中,误用加锁可能会产生一些问题。最常见和突出的问题是死锁。死锁是一种状态,在这种状态下,许多执行实体相互等待,因此都无法继续下去。死锁决不能存在于并发程序中。有多种方法可以解决可能的死锁问题,其中包括死锁预防、死锁规避、死锁检测和恢复等等。在实际系统中,唯一可行的方法是死锁预防,试图在设计并行算法时防止死锁的发生。一种简单的死锁预防方法是对互斥量进行排序,并确
    保每个线程只在一个方向请求互斥量,这样请求序列中就不会有循环。
  3. Linux中的线程
    与许多其他操作系统不同,Linux不区分进程和线程。对于Linux内核,线程只是一个与其他进程共享某些资源的进程。在Linu x中,进程和线程都是由clone()系统调用创建的,具有以下原型:
    int clone(int (*fn) (void *), void *child_stack, int flags,void *arg)
    可以看出,clone()更像是一个线程创建函数。它创建一个子进程来执行带有child_stack的函数fn(arg)。flags字段详细说明父进程和子进程共享的资源,包括:
    CLONE_VM:父进程和子进程共享地也址空间
    CLONE_FS:父进程和子进程共享文件系统信息,例如根节点、CWD
    CLONE_FILES:父进程和子进程共享打开的文件
    CLONE_SIGHAND:父进程和子进程共享信号处理函数和已屏蔽信号

苏格拉底挑战

针对并发编程知识点的苏格拉底挑战






针对线程同步知识点的苏格拉底挑战





标签:attr,笔记,学习,互斥,死锁,线程,pthread,进程
From: https://www.cnblogs.com/wzj1234/p/17794471.html

相关文章

  • 2023-2024-1 20231329《计算机程序与设计》第五周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK05这个作业的目标计算机科学概论第6章并完成云班课测试《C语言程序设计》第4章并完成云班课测试......
  • 自制x86 BOOTLADER开发笔记(1)——— 开发环境配置
    前言数年前,出于对于操作系统内核的好奇和兴趣,看了一些自制内核资料和教程,断断续续地也写了一个简单的的玩具内核。在学习的过程中,往往第一步遇到的问题就是内核的加载和系统的引导,发现不少教程都使用grub等现成的工具直接完成这一步骤,这样能快速的完成读取硬盘、加载内核文件、......
  • Go语言数组与切片学习总结
    一.数组数组的定义:相同类型的数据集合go语言中数组的索引从0开始没有赋值的数值型数组,默认值为0数组一旦被创建,它的大小就是不可改变的(1)声明数组与打印var变量名[大小]变量类型//数组的声明varnums[4]int//数组的赋值nums[0]=1nums[1]=2nums[2]=......
  • 信息搜集技术课程笔记
    情报侦察技术工具主动收集容易暴露。主动和被动收集的区别在于有没有和被收集对象有直接的交互,深度交流。被动则是利用公开渠道进行信息收集。情报侦察技战术前期的侦察内容国外用的比较多的是:Google、bing国内用的多的是:fpfa、baidu、zoomeye等可以上传IP、文件、某一段md5值可以......
  • 《程序员修炼之道:从小工到专家》第三第四章读书笔记
    第三章基本工具第14节纯文本的威力本节是第三章:基本工具,首节内容,章节介绍里有一句话:许多新程序员都会犯下错误,采用单一的强力工具,比如特定的集成开发环境(IDE),而且再也不离开其舒适的界面。这实在是一个错误。我们要乐于超越IDE所施加的各种限制。要做到这一点,唯一的途径是保持......
  • 《信息安全系统设计与实现》第八周学习笔记
    并行计算导论顺序算法与并行算法并行性与并发性通常,并行算法只识别可并行执行的任务,但是它没有规定如何将任务映射到处理组件。在理想情况下,并行算法中的所有任务都应该同时实时执行CPU系统中,并发性是通过多任务处理来实现的线程线程的原理线程是操作系统能够进行运算......
  • 基于深度学习的森林火灾识别技术:实时监测与智能预警
    森林火灾是全球范围内的严重自然灾害之一,对生态环境和人类社会造成了巨大的破坏。传统的火灾监测方法在面对广阔的森林地区时存在一定的局限性,因此,开发一种能够快速、准确地识别森林火灾的智能系统变得至关重要。本文将介绍基于深度学习的森林火灾识别方法,通过使用深度学习算法,我们......
  • c语言学习的第三天
    intmain()//{// externintg_val;// printf("g_val=%d\n",g_val);//extern--申明外部符号+// return0;//static修饰全局变量改变了变量的作用域,让静态的全局变量只能在自己所在的源文件内部使用,出了源文件就没法在使用了//static修饰函数改变了函数的链接属性 //st......
  • 学习笔记7(第四章)
    一、知识点归纳(一)知识点内容教材学习内容总结本章论述了并发编程,介绍了并行计算的概念,指出了并行计算的重要性;比较了顺序算法与并行算法,以及并行性与并发性;解释了线程的原理及其相对于进程的优势;解释了死锁问题,并说明了如何防止并发程序中的死锁问题;讨论了信号量,并论证了它......
  • 混合学习教学实践对高中英语短篇故事教学中学生动机和自主性的影响
    (Effectsofblendedlearningpedagogicalpractices onstudents motivationandautonomyforthe teachingofshortstoriesinupper secondary English) https://doi.org/10.1080/10494820.2018.1542318一、摘要研究目的:本研究旨在探讨混合式学习对学业成绩、学习......