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

学习笔记7

时间:2023-10-29 15:12:56浏览次数:32  
标签:attr thread 笔记 学习 互斥 死锁 线程 pthread

苏格拉底挑战


第四章 并发编程

一、知识点归纳

(一)线程

1.线程的原理

2.线程的优点

  • (1)线程创建和切换速度更快

  • (2)线程的响应速度更快

  • (3)线程更适合并行计算

3.线程的缺点

  • (1)由于地址空间共享,线程需要来自用户的明确同步。

  • (2)许多库函数可能对线程不安全。

  • (3)在单CPU系统上,使用线程解决问题实际上要比使用顺序程序慢,这是由在运行时创建线程和切换上下文系统开销造成的。

(二)线程操作

(三)线程管理函数

Pthread 库提供了用于线程管理的以下 API。

pthread_create(thread, attr, function, arg): create thread
pthread_exit(status)                    : terminate thread
pthread_cancel(thread)                   : cancel thread
pthread_attr_init(attr)                   : initialize thread attributes
pthread_attr_destroy(arr)                 : destroy thread attributes

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填充。

2.线程ID

3.线程终止

4.线程连接

(四)线程示例程序(见实践内容)

1.用线程计算矩阵的和

2.用线程快速排序

(五)线程同步

  • 竞态条件:当多个线程试图修改同一共享变量或数据结构时,修改结果取决于线程的执行顺序。

1.互斥量

最简单的同步工具是锁,它允许执行实体仅在有锁的情况下才能执行。在 Pthread 中,锁被称为互斥量,意思是相互排斥。互斥变量是用 pthread_mutex_t 类型声明,在使用之前必须对它们进行初始化。有两种方法可以初始化互斥量。

  1. 一种是静态方案,如:pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER 定义互斥量 m,并使用默认属性对其进行初始化。
  2. 另一种是动态方案,使用pthread_mutex_init()函数,可通过 attr 参数设置互斥属性,如:pthread_mutex_init(pthread_mutex_t *m, pthread_mutexattr_t, *attr); 通常,attr 参数可以设置为 NULL,作为默认属性。

2.死锁预防

互斥量使用封锁协议。如果某线程不能获取互斥量,就会被阻塞,等待互斥量解锁后再继续。在任何封锁协议中,误用加锁可能会产生一些问题。最常见和突出的问题是死锁。死锁是一种状态,在这种状态下,许多执行实体相互等待,因此都无法继续下去。

与竞态条件类似,死锁决不能存在于并发程序中。有许多方法可以解决可能的死锁问题,其中包括死锁预防、死锁规避、死锁检测和恢复等。在实际系统中,唯一可行的方法是死锁预防,试图在设计并行算法时防止死锁的发生。一种简单的死锁预防方法是对互斥量进行排序,并确保每个线程只在一个方向请求互斥量,这样请求序列中就不会有循环。

但是,仅使用单向加锁请求来设计每个并行算法是不可能的。在这种情况下,可以使用条件加锁函数 pthread_mutex_trylock() 来预防死锁。如果互斥量已被加锁,则 trylock()函数会立即返回一个错误。在这种情况下,调用线程可能会释放它已经获取的一些互斥量以便进行退避,从而让其他线程继续执行。在上面的交叉加锁示例,我们可以重新设计一个线程,例如 T1,利用条件加锁和退避来预防死锁。

/*Thread T1*/
while(1){
    lock(m1);
    if(!trylock(m2))
        unlock(m1);
    else
        break;
}

3.条件变量

4.生产者—消费者问题

5.信号量

  • 信号量是进程同步的一般机制。

6.屏障

7.用并发线程解线性方程式

8.Linux 中的线程

与许多其他操作系统不同,Linux 不区分进程和线程。对于 Linux 内核,线程只是一个与其他进程共享某些资源的进程。在 Linux 中,进程和线程都是由 clone() 系统调用创建的,具有以下原型:

int clone(int (*fn)(void *), void *child_stack, int flags, void *arg)

可以看出,clone()更像是一个线程创建函数。它创建一个子进程来执行带有 child_stack的函数fn(arg)。flag 字段详细说明父进程和子进程共享的资源。

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

相关文章

  • java学习-API
    APIjava中的API:就是jdk中提供的各种功能的java类,这些类将底层的实现封装了起来,使用的时候直接调用即可类的例子键盘录入:Scanner类next():遇到了空格就不会继续录入数据nextLine():可以将数据完整的接受过来,结束的标志就是回车换行符号例子packagecom.mystudy.APIlei;im......
  • 《Attention Is All You Need》阅读笔记
    论文标题《AttentionIsAllYouNeed》XXXIsAllYouNeed已经成一个梗了,现在出现了很多叫XXXIsAllYouNeed的文章,简直标题党啊,也不写方法,也不写结果,有点理解老师扣论文题目了。作者这个作者栏太夸张了。八个作者全部标星,均等贡献。甚至专门写了一段介绍每个人的工......
  • 2023-2024-1 20231410刘珈岐 《计算机基础与程序设计》第5周学习总结
    2023-2024-120231410刘珈岐《计算机基础与程序设计》第5周学习总结作业信息这个作业属于哪个课程[2023-2024-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP)这个作业要求在哪里2023-2024-1计算机基础与程序设计第5周作业)这个......
  • Linux操作系统学习3
    上周学的是Linux操作系统中的文件权限中的基本权限,也就是UGO。这一周学的是基本权限后面的一些知识。主要是文件权限中的高级权限。有以下几个内容:SUID权限,SGID权限,Sticky权限。/usr/bin/passwd/,在这个文件中,第一行的第四个字符为“s”,这个s代的就是特殊权限,也就是SUID权限。任何......
  • 2023-2024-1学期 20231424 《计算机基础与程序设计》第5周学习总结
    作业属于的课程<班级链接>(2022-2023-1-计算机基础与程序设计)作业要求<作业要求链接>(2022-2023-1计算机基础与程序设计第一周作业)这个作业的目标《计算机科学概论》第6章和《C语言程序设计》第4章  计算机科学概论知道了伪代码是一种类似于编程语言的描述......
  • 学习笔记7
    第四章总结并行计算导论要求解某个问题,先要设计一种算法,描述如何一步步地解决问题,然后用计算机程序以串行指令流的形式实现该算法。在只有一个CPU的情况下,每次只能按顺序执行某算法的一个指令和步骤。但是,基于分治原则(如二又树查找和快速排序等)的算法经常表现出高度的并行性,......
  • 2023-2024-1学期 20231424 《计算机基础与程序设计》第5周学习总结
    2023-2024-1学期20231424《计算机基础与程序设计》第5周学习总结作业信息作业属于的课程<班级链接>(2022-2023-1-计算机基础与程序设计)作业要求<作业要求链接>(2022-2023-1计算机基础与程序设计第一周作业)这个作业的目标《计算机科学概论》第6章和《C语言程序......
  • Unity学习笔记--入门
    Unity引擎学习入门:Unity中的坐标系:左手坐标系(z轴正方向向里面)x轴:平行屏幕向右正方向y轴:平行屏幕向上正方向Z轴:垂直屏幕向内为正方向【补】openGL是右手坐标系DirectX是左手坐标系窗口:窗口布局Layout:Scene这里我们可以看见所有的场景内容。窗口上的工具栏:有关......
  • 《信息安全系统设计与实现》第八周学习笔记
    《信息安全系统设计与实现》第八周学习笔记第四章并发编程并行计算尝试使用多个执行并行算法的处理器更快速的解决问题顺序算法与并行算法顺序算法:所有步骤通过单个任务依次执行,每次执行一个步骤,当所有步骤执行完成时,算法结束。并行算法:cobegin-coend代码块来指定独立......
  • Oracle RAC 的简单学习
    OracleRAC的概念OracleRAC(RealApplicationClusters)是Oracle数据库管理系统的一个功能,它允许将数据库实例部署在多个节点上,实现高可用性和可伸缩性。通过将数据库实例分散在不同的服务器上,OracleRAC提供了系统级别的容错能力,即使在一个节点故障的情况下,数据库仍然可......