学习笔记七
一、作业要求
自学教材第4章,提交学习笔记(10分),评分标准如下
-
知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容 (4分)
“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”
核心是要求GPT:“请你以苏格拉底的方式对我进行提问”
然后GPT就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”
如果你觉得差不多了,可以先问问GPT:“针对我XXX知识点,我理解了吗?”
GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。
-
问题与解决思路,遇到问题最先使用chatgpt等AI工具解决,并提供过程截图(3分)
-
实践过程截图,代码链接(2分)
-
其他(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(1分)
二、知识点总结
1. 并行计算导论
1.1 顺序算法与并行算法
在描述顺序算法中,常用一个begin-end代码块列出算法。
-
begin-end代码块中的顺序算法可能包含多个步骤,所有步骤都是通过某个任务依次执行的。
-
cobegin-coend代码块指定并行算法的独立任,所有任务都是并行执行的。
1.2 并行性与并发性
在理想情况下,并行算法中的所有任务都应该同时实时执行。
2. 线程
2.1 线程的原理
在进程模型中,进程是独立的执行单元。所有进程均在内核模式或用户模式下执行。在内核模式下,各进程在唯一地址空间上执行,与其他进程是分开的。虽然每个进程都是一个独立的单元,但是它只有一个执行路径。
2.2 线程的优点
与进程相比,线程有许多优点:
-
线程创建和切换速度更快
-
线程的响应速度更快
-
线程更适合并行计算
2.3 线程的缺点
另一方面,线程也有一些缺点,其中包括:
-
由于地址空间共享,线程需要来自用户的明确同步。
-
许多库函数可能对线程不安全,例如传统 strtok()函数。
-
在单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提问
标签:知识点,void,笔记,学习,互斥,线程,pthread,执行 From: https://www.cnblogs.com/llwwjj/p/17793854.html