首页 > 其他分享 >学习笔记7(第四章)

学习笔记7(第四章)

时间:2023-10-28 16:58:20浏览次数:31  
标签:void 笔记 学习 线程 pthread 进程 执行 第四章 row

一、知识点归纳

(一)知识点内容

教材学习内容总结

本章论述了并发编程,介绍了并行计算的概念,指出了并行计算的重要性;比较了顺序算法与并行算法, 以及并行性与并发性;解释了线程的原理及其相对于进程的优势;解释了死锁问题, 并说明了如何防止并发程序中的死锁问题;讨论了信号量, 并论证了它们相对千条件变量的优点;还解释了支待 Linux 中线程的独特方式。

4.1 并行计算

1. 背景:

早期计算机只有一个处理组件,称为处理器或中央处理器,程序多进行串行计算,而基于分治原则的算法具有高度并行性,因此出现尝试使用多个执行并行算的处理器来解决问题的并行计算方案。

2. 顺序算法与并行算法

  • 顺序算法所有步骤都是通过单个步骤依次执行的,所有步骤执行完成则算法结束。

  • 并行算法中同一个代码块中的步骤并行执行,在全部完成后再执行下一个代码块的步骤。

4.2 线程

1. 线程原理

一个操作系统包含许多并发进程。在进程模型中,进程是独立的执行单元。所有进程均是在内核模式和用户模式下进行的。

  • 内核模式下:各进程在唯一地址空间上执行,与其他进程是分开的,多个独立的进程共用同一个执行路径,当某进程必须等待某事件时,整个进程就会停止执行。

  • 线程是某进程同一地址空间上的独立执行单元。创建某个进程就是在一个唯一地址空间创建一个主线程。

2. 线程优点

  1. 线程创建和切换速度更快
  2. 线程的响应速度更快
  3. 线程更适合并行计算

3. 线程缺点

  1. 由于地址空间共享,线程需要来自用户的明确同步
  2. 许多库函数可能对线程不安全
  3. 在单CPU系统上,使用线程解决问题实际上要比使用顺序程序更慢。

4.3 线程操作

线程的执行轨迹与进程类似。用户可在内核模式或用户模式下进行。

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

4.4 线程管理函数

1、 创建线程 使用pthread_create()函数创建线程

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);

2、 线程ID 使用pthread_equal()函数对线程ID进行比较

int pthread_equal(pthread_t t1,pthread_t t2); 

不同线程返回0,否则返回非0 `

3、 线程终止 线程可以调用函数进行终止

 void pthread_exit(void *status); 

0退出值表示正常终止,非0值表示异常终止

4、 线程连接 一个线程可以等待另一个线程的终止,通过函数终止线程的退出状态。

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

(二)苏格拉底挑战

1、问题一

2、问题二

二、问题与解决思路

(一)问题

在给矩阵排序时,编译出现错误

(二)解决思路

经询问GPT和同学,我得知需要先加-pthread,随后编译成功

三、实践过程

(一)矩阵排序


(二) 计算矩阵和

1、代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define N 4
int A[N][N], sum[N];
void *func(void *arg)
{
    int j, row;
    pthread_t tid = pthread_self(); // get thread ID number 
    row = (int)arg;	// get row number from arg
    printf("Thread %d [%lu] computes sum of row %d\n", row, tid, row); 
    for (j=0; j<N; j++)
    {
        sum[row] += A[row][j];
    }
    printf("Thread %d [%lu] done sum[%d] = %d\n",row, tid, row, sum[row]);
    pthread_exit((void*)0); // thread exit: 0=normal termination
}

int main (int argc, char *argv[])
{
    pthread_t thread[N];	// thread IDs
    int i, j, r, total = 0;
    void *status;
    printf("Main: initialize A matrix\n");

    for (i=0; i<N; i++)
    {
        sum[i] = 0;
        for (j=0; j<N; j++)
        {
            A[i][j] = i*N + j + 1;
            printf("%4d" ,A[i][j]);
        }
    printf("\n");
    }
    printf("Main: create %d threads\n", N);
    for(i=0; i<N; i++)
    {
        pthread_create(&thread[i], NULL, func, (void *)i);
    }
    printf("Main: try to join with threads\n");
    for(i=0; i<N; i++) 
    {
        pthread_join(thread[i], &status);
        printf("Main: joined with %d [%lu]: status=%d\n",i, thread[i], (int)status);
    }
    printf("Main: compute and print total sum:"); 
    for (i=0; i<N; i++)
    {
        total += sum[i];
    }
    printf("tatal = %d\n", total); 
    pthread_exit(NULL);
}

2、具体步骤


标签:void,笔记,学习,线程,pthread,进程,执行,第四章,row
From: https://www.cnblogs.com/20211125mjz/p/17794258.html

相关文章

  • 混合学习教学实践对高中英语短篇故事教学中学生动机和自主性的影响
    (Effectsofblendedlearningpedagogicalpractices onstudents motivationandautonomyforthe teachingofshortstoriesinupper secondary English) https://doi.org/10.1080/10494820.2018.1542318一、摘要研究目的:本研究旨在探讨混合式学习对学业成绩、学习......
  • 2023-2024-1-20231317<<计算机基础与程序设计>>第五周学习总结
    《计算机基础与程序设计》第五周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2023-2024-1计算机基础与程序设计第五周作业)这个作业的目标<学习《C语言第五章选择控制结构、第六章循......
  • 20211314王艺达学习笔记7
    第四章并发编程教材知识点归纳本章主要讲述并发编程,介绍了并行计算的概念,指出了并行计算的重要性;比较了顺序算法与并行算法,以及并行性与并发性;解释了线程的原理及其相对于进程的优势;介绍了Pthread中的线程操作,包括线程管理函数,互斥量、连接、条件变量和屏障等线程同步工具;通过......
  • 《信息安全系统设计与实现》第八周学习笔记
    一、课程内容第三章学习1、并行计算是一种计算方案,它尝试使用多个执行并行算法的处理器更快速的解决问题顺序算法与并行算法并行性与并发性并行算法只识别可并行执行的任务。CPU系统中,并发性是通过多任务处理来实现的2、线程线程的原理:某进程同一地址空间上的独立执行单......
  • 学习笔记:欧拉图 & 欧拉路
    欧拉图&欧拉路定义图中经过所有边恰好一次的路径叫欧拉路径(也就是一笔画)。如果此路径的起点和终点相同,则称其为一条欧拉回路。欧拉回路:通过图中每条边恰好一次的回路。欧拉通路:通过图中每条边恰好一次的通路。欧拉图:具有欧拉回路的图。半欧拉图:具有欧拉通路但不具有欧拉......
  • C#基础代码学习
    usingSystem;usingSystem.Collections.Generic;publicclassStudent{publicstringName{get;set;}}classMyClass{//用于存储学生对象的集合privateList<Student>test;//构造方法示例话调用类似PHP中的__constructpublicMyClass()......
  • 学习笔记:二分图
    二分图引入二分图又被称为二部图。二分图就是可以二分答案的图。二分图是节点由两个集合组成,且两个集合内部没有边的图。换言之,存在一种方案,将节点划分成满足以上性质的两个集合。性质如果两个集合中的点分别染成黑色和白色,可以发现二分图中的每一条边都一定是连接一个黑色......
  • 学习笔记:拓扑排序
    拓扑排序引入拓扑排序是一个有向无环图的所有顶点的线性序列。该序列需要满足每个顶点出现且只出现一次和如果有一条AA到BB的路径,在序列中AA出现在BB的前面。实现拓扑排序的步骤:计算每个点的入度。入度为\(0\)就加入队列。当队列不为空则循环:取出队首元素并......
  • javaweb学习每日总结-第八天
    第八天学习Springboot今天也终于是学到了springboot的技术,springboot是一款Java开发的框架,也是当下最流行的开发方式,没有之一!今天我进行了springboot技术的入门,初步了解了springboot技术的发展和应用,也用idea写了一个最简单的springboot程序。除此之外,我还下载了postmen这个软......
  • 学习笔记7
    第三章第四章并发编程并行计算并行计算是一种计算方案,它尝试使用多个执行并行算法的处理器更快速的解决问题顺序算法与并行算法并行性与并发性并行算法只识别可并行执行的任务。CPU系统中,并发性是通过多任务处理来实现的线程线程的原理某进程同一地址空间上的独立执行......