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

学习笔记7

时间:2023-10-28 15:22:40浏览次数:43  
标签:arr int void 笔记 学习 线程 pthread left

第三章 第四章 并发编程

并行计算

并行计算是一种计算方案,它尝试使用多个执行并行算法的处理器更快速的解决问题

顺序算法与并行算法

并行性与并发性

并行算法只识别可并行执行的任务。CPU系统中,并发性是通过多任务处理来实现的

线程

线程的原理

某进程同一地址空间上的独立执行单元

线程的优点

  • 线程创建和切换速度更快
  • 线程的响应速度更快
  • 线程更适合并行运算

线程的缺点

  • 线程需要来自用户的明确同步
  • 库函数不安全
  • 单CPU系统中,线程解决问题实际上要比使用顺序程序慢

线程示例程序

用线程计算矩阵的和

#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);
}

实践

编程项目:用线程进行快速排序
相关的代码:


#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

#define MAX_SIZE 100

void quickSort(int arr[], int left, int right);
void* quickSortThread(void* arg);

void quickSort(int arr[], int left, int right) {
    if (left >= right) {
        return;
    }
    
    int pivot = arr[left];
    int i = left + 1;
    int j = right;
    
    while (i <= j) {
        while (i <= j && arr[i] <= pivot) {
            i++;
        }
        
        while (i <= j && arr[j] > pivot) {
            j--;
        }
        
        if (i < j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    
    int temp = arr[left];
    arr[left] = arr[j];
    arr[j] = temp;
    
    pthread_t threads[2];
    int args1[] = {arr, left, j - 1};
    int args2[] = {arr, j + 1, right};
    pthread_create(&threads[0], NULL, quickSortThread, (void*)args1);
    pthread_create(&threads[1], NULL, quickSortThread, (void*)args2);
    
    pthread_join(threads[0], NULL);
    pthread_join(threads[1], NULL);
}

void* quickSortThread(void* arg) {
    int* args = (int*)arg;
    int* arr = args[0];
    int left = args[1];
    int right = args[2];
    
    quickSort(arr, left, right);
    
    pthread_exit(NULL);
}

int main() {
    int arr[MAX_SIZE];
    int size;
    
    printf("Enter the number of elements: ");
    scanf("%d", &size);
    
    printf("Enter the elements:\n");
    for (int i = 0; i < size; i++) {
        scanf("%d", &arr[i]);
    }
    
    int args[] = {arr, 0, size - 1};
    
    pthread_t sortThread;
    pthread_create(&sortThread, NULL, quickSortThread, (void*)args);
    
    pthread_join(sortThread, NULL);
    
    printf("Sorted array: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    return 0;
}

运行结果:

苏格拉底挑战

  1. 知识点1:线程同步

    我在学习线程同步知识点,请你以苏格拉底的方式对我进行提问,一次一个问题。

 - 针对我线程同步知识点,我理解了吗?

 - 我的回答结束了,请对我的回答进行评价总结。

  1. 知识点2:线程管理函数

    • 我在学习使用线程管理函数知识点,请你以苏格拉底的方式对我进行提问,一次一个问题。

    • 针对我线程管理函数知识点,我理解了吗?

    • 我的回答结束了,请对我的回答进行评价总结。

问题与解决思路

在学习过程中,我遇到了以下问题,并使用chatgpt等AI工具解决:

  1. 问题1:多个进程相互等待对方释放资源,导致所有进程都无法继续执行

标签:arr,int,void,笔记,学习,线程,pthread,left
From: https://www.cnblogs.com/zqr031029/p/17794110.html

相关文章

  • yzy第七周学习笔记
    第四章并发编程4.1并行计算导论Linux环境中有很多应用程序和很多进程,其中最重要的是客户端网络/服务器。多进程服务器是指当客户端发出请求时,服务器使用子进程来处理客户端的请求。父进程继续等待来自其他客户端的请求。这种方法的优点是服务器可以在客户端请求时管理客户......
  • php代码审计学习----蜜蜂cms代码审计
    php代码审计学习----蜜蜂cms代码审计源码https://github.com/Betsy0/CMSVulSource/tree/main/beescms环境搭建这个需要用docker搭建环境用windows的phpstudy会出现403然后chmod-R777html在docker容器里mysql-uroot-prootcreatedatabasebeescms;然后再/etc/mysq......
  • 学习笔记七
    学习笔记七一、作业要求自学教材第4章,提交学习笔记(10分),评分标准如下知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”核......
  • 阅读笔记5
    领域驱动设计的最佳实践领域驱动设计(DDD)有一些最佳实践,可以帮助您更好地应对软件核心复杂性:建模与沟通:建立共享的领域模型,确保开发团队和领域专家之间的共同理解。使用通用语言来描述领域对象和操作。持续演化:领域模型是一个持续演化的过程。随着对业务需求的深入了解,不断改进和......
  • uboot中am335x的relocate分析--Apple的学习笔记
    一,前言今天我主要先分析下bbblack的relocate。至于为什么要分析这块内容,因为我个人理解,内存分布也是重要内容,最关键的是这些内容我3年前分析过TQ2440的,但是没分析过bbblack的,所以补上。二,实践先在board_f.c中添加#define_DEBUG1就支持debug函数打印信息了。U-Boot2023.10(Oc......
  • 2023-2024-1 20211306 密码系统设计与实现课程学习笔记7
    20211306密码系统设计与实现课程学习笔记7任务详情自学教材第4章,提交学习笔记知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题......
  • Linux第4章学习笔记
    第四章学习笔记并发编程并行计算导论早期,大多数计算机只有一个处理组件,称为处理器或中央处理器(CPU)。受这种硬件条件的限制,计算机程序通常是为串行计算编写的。并行计算是一种计算方案,它尝试使用多个执行并行算法的处理器更快速地解决问题。顺序算法和并行算法并行性与并发......
  • 数字图像处理实验笔记
    实验一数学形态学图像处理实验内容与要求使用结构元素函数strel分别定义'square'和'disk'形状的结构元素,对下图(a)所示的二值图像进行腐蚀(imerode)和膨胀(imdilate)操作,分析腐蚀和膨胀运算的作用。结合腐蚀和膨胀运算,使用开运算(imopen)和闭运算(imclose),对下图(b)所示的二值图像进行开运......
  • 第四章学习笔记
    第四章学习笔记第四章并发编程本章论述了并发编程,介绍了并行计算的概念,并指出了并行计算的重要性;比较了顺序算法与并行算法,以及并行性与并发性;解释了线程的原理及其相对于进程的优势;介绍了Pthread中的线程操作,包括线程管理函数,互斥量、连接、条件变量和屏障等线程同步工具;解释......
  • HuggingFace机器视觉学习
    HuggingFace中计算机视觉的现状:https://huggingface.co/blog/zh/cv_state从0开始timm库的quickstarthttps://huggingface.co/docs/timm/quickstart例子中通过调用模型mobilenetv3_large_100识别图像mobilenetv3_large_100模型的说明页https://huggingface.co/timm/mobi......