学习笔记七

学习笔记七

一、作业要求

自学教材第4章,提交学习笔记(10分),评分标准如下

  1. 知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容 (4分)

“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”

核心是要求GPT:“请你以苏格拉底的方式对我进行提问”

然后GPT就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”

如果你觉得差不多了,可以先问问GPT:“针对我XXX知识点,我理解了吗?”

GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。

  1. 问题与解决思路,遇到问题最先使用chatgpt等AI工具解决,并提供过程截图(3分)

  2. 实践过程截图,代码链接(2分)

  3. 其他(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(1分)

二、知识点总结

1. 并行计算导论

1.1 顺序算法与并行算法

在描述顺序算法中,常用一个begin-end代码块列出算法。

  • begin-end代码块中的顺序算法可能包含多个步骤,所有步骤都是通过某个任务依次执行的。

  • cobegin-coend代码块指定并行算法的独立任,所有任务都是并行执行的。

1.2 并行性与并发性

在理想情况下,并行算法中的所有任务都应该同时实时执行。

2. 线程

2.1 线程的原理

在进程模型中,进程是独立的执行单元。所有进程均在内核模式或用户模式下执行。在内核模式下,各进程在唯一地址空间上执行,与其他进程是分开的。虽然每个进程都是一个独立的单元,但是它只有一个执行路径。

2.2 线程的优点

与进程相比,线程有许多优点:

  1. 线程创建和切换速度更快

  2. 线程的响应速度更快

  3. 线程更适合并行计算

2.3 线程的缺点

另一方面,线程也有一些缺点,其中包括:

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

  2. 许多库函数可能对线程不安全,例如传统 strtok()函数。

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

3. 线程操作

线程操作的执行轨迹与进程类似。线程可在内核模式或用户模式下执行。在用户模式下,线程在进程的相同地址空间中执行,但每个线程都有自己的执行堆栈。线程是独立的执行单元,可根据操作系统内核的调度策略,对内核进行系统调用,变为挂起、激活以继续执行等。

4. 线程管理函数

4.1 创建线程
int pthread_create(pthread_t *thread_id,pthread_attr_t *attr,void *(*func)(void*), void *arg);
4.2 线程ID

线程ID是一种不透明的数据类型,取决于实现情况。因此,不应该直接比较线程ID。如果需要,可以使用pthread_equal()函数对它们进行比较。

int pthread_equal(pthread_t t1,pthread_t t2);

如果是不同的线程,则返回0,否则返回非0

4.3 线程终止

线程函数结束后,线程即终止。或者,线程可以调用函数

void pthread_exit(void *status);

进行显式终止,其中状态是线程的退出状态。通常,0退出值表示正常终止,非0值表示异常终止

4.4 线程连接

一个线程可以等待另一个线程的终止,通过:

int pthread_join (pthread_t thread, void **status ptr);

终止线程的退出状态以status_ptr返回。

5. 线程同步

5.1 互斥量

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

  • 静态方法:定义互斥变量m,并使用默认属性对其进行初始化。

pthreaa_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
  • 动态方法:使用pthread_ mutex _init()函数,可通过attr参数设置互斥属性,如:

pthread_mutex_init(pthread_mutex_t *m,pthread_mutexattr_t,*attr);
5.2 死锁预防

死锁是一种状态,在这种状态下,许多执行实体相互等待,因此都无法继续下去,一种简单的死锁预防是对互斥量进行排序,并确保每个线程只在一个方向请求互斥量,这样请求序列中就不会有循环。

5.3 条件变量

条件变量提供了一种线程协作的方法,首先获取相关的互斥量。然后,它在互斥量的临界区内执行操作,然后释放互斥量。

5.4 信号量

信号量是进程同步的一般机制,也是一种数据结构

struct sem{
 int value;
 struct process *queue
}s;

三、代码实现

编译显示pthread是未定义的引用

通过chatgpt询问,在代码命令后加入-pthread,编译通过

四、利用chatgpt提问

 

posted @ 2023-10-28 14:24  20211307李文婧  阅读(9)  评论(0编辑  收藏  举报