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

学习笔记7

时间:2023-10-28 10:34:07浏览次数:37  
标签:函数 res 笔记 学习 互斥 线程 pthread 执行

教材知识点总结

并行计算导论:

  • 顺序算法与并行算法:顺序算法是按照一定的顺序执行的算法,而并行算法是可以同时执行多个任务的算法。并行算法可以通过将任务分解为多个子任务并行执行来提高计算效率。

  • 并行性与并发性:并行性是指多个任务同时进行,而并发性是指多个任务交替进行。并行性可以通过硬件的并行处理能力来实现,而并发性则是通过操作系统的调度机制来实现。

线程:

  • 线程的原理:线程是操作系统中最小的执行单位,它是进程的一部分,共享进程的资源。线程可以独立执行,并且可以与其他线程共享数据。

  • 线程的优点:线程可以提高程序的响应速度和处理能力,可以充分利用多核处理器的并行处理能力,可以更好地利用系统资源。

  • 线程的缺点:线程之间共享资源可能会导致竞争条件和数据不一致的问题,线程的创建和销毁需要一定的开销。

线程操作:

  • 创建线程:可以使用线程库提供的函数来创建线程,例如pthread_create()函数。

  • 线程ID:每个线程都有一个唯一的线程ID,可以使用pthread_self()函数获取当前线程的ID。

  • 线程终止:线程可以通过返回一个值或者调用pthread_exit()函数来终止自己的执行。

  • 线程连接:可以使用pthread_join()函数等待一个线程的结束,并获取它的返回值。

线程管理函数:

  • 互斥量:用于实现线程之间的互斥访问共享资源,可以使用pthread_mutex_init()函数初始化互斥量,使用pthread_mutex_lock()函数和pthread_mutex_unlock()函数来加锁和解锁互斥量。

  • 死锁预防:死锁是指多个线程相互等待对方释放资源而无法继续执行的情况,可以通过合理设计互斥量的加锁顺序来避免死锁。

  • 条件变量:用于实现线程之间的同步和通信,可以使用pthread_cond_init()函数初始化条件变量,使用pthread_cond_wait()函数等待条件变量的满足,使用pthread_cond_signal()函数或pthread_cond_broadcast()函数唤醒等待条件变量的线程。

  • 生产者-消费者问题:是一个经典的线程同步问题,生产者线程生成数据,消费者线程消费数据,需要使用互斥量和条件变量来实现线程之间的同步。

  • 信号量:用于实现线程之间的同步和互斥访问共享资源,可以使用sem_init()函数初始化信号量,使用sem_wait()函数和sem_post()函数来等待和释放信号量。

  • 屏障:用于实现线程之间的同步,可以使用pthread_barrier_init()函数初始化屏障,使用pthread_barrier_wait()函数等待所有线程到达屏障。

  • 用并发线程解线性方程组:可以使用并行计算的方法来解决线性方程组,将方程组分解为多个子任务并行计算。

  • Linux中的线程:Linux提供了丰富的线程库和系统调用,可以使用pthread库来进行线程编程。

苏格拉底挑战






实践

#include <stdio.h>
#include <pthread.h>
//定义线程要执行的函数,arg 为接收线程传递过来的数据
void *Thread1(void *arg)
{
    printf("http://c.biancheng.net\n");
    return "Thread1成功执行";
}
//定义线程要执行的函数,arg 为接收线程传递过来的数据
void* Thread2(void* arg)
{
    printf("C语言中文网\n");
    return "Thread2成功执行";
}

int main()
{
    int res;
    pthread_t mythread1, mythread2;
    void* thread_result;
    /*创建线程
    &mythread:要创建的线程
    NULL:不修改新建线程的任何属性
    ThreadFun:新建线程要执行的任务
    NULL:不传递给 ThreadFun() 函数任何参数

    返回值 res 为 0 表示线程创建成功,反之则创建失败。
    */
    res = pthread_create(&mythread1, NULL, Thread1, NULL);
    if (res != 0) {
        printf("线程创建失败");
        return 0;
    }

    res = pthread_create(&mythread2, NULL, Thread2, NULL);
    if (res != 0) {
        printf("线程创建失败");
        return 0;
    }
    /*
    等待指定线程执行完毕
    mtThread:指定等待的线程
    &thead_result:接收 ThreadFun() 函数的返回值,或者接收 pthread_exit() 函数指定的值

    返回值 res 为 0 表示函数执行成功,反之则执行失败。
    */
    res = pthread_join(mythread1, &thread_result);
    //输出线程执行完毕后返回的数据
    printf("%s\n", (char*)thread_result);
   
    res = pthread_join(mythread2, &thread_result);
    printf("%s\n", (char*)thread_result);
    printf("主线程执行完毕");
    return 0;
}



程序中共存在 3 个线程,包括本就存在的主线程以及两个调用 pthread_create() 函数创建的线程(又称子线程),其中名为 mythread1 的线程负责执行 thread1() 函数,名为 mythread2 的线程负责执行 thread2() 函数。

程序中调用了两次 pthread_join() 函数,第 47 行 pthread_join() 函数的功能是令主线程等待 mythread1 线程执行完毕后再执行后续的代码,第 51 行处 pthread_join() 函数的功能是令主线程等待 mythread2 线程执行完毕后在执行后续的代码。
————————————————
版权声明:代码来自CSDN博主「Loren灬」的原创文章
原文链接:https://blog.csdn.net/yizhizainulii/article/details/124297432

标签:函数,res,笔记,学习,互斥,线程,pthread,执行
From: https://www.cnblogs.com/wang-chen-kai/p/17793742.html

相关文章

  • 学习笔记:最小生成树
    最小生成树引入我们定义无向连通图的最小生成树(MinimumSpanningTree,MST)为边权和最小的生成树。注意:只有连通图才有生成树,而对于非连通图,只存在生成森林。实现求最小生成树的算法有Prim和Kruskal两种。这里我们主要讲解Kruskal算法(其实是因为太菜了不会Prim)。Krusk......
  • 学习笔记:一些语言技巧
    一些语言技巧其实有些东西个人平时根本用不到,然而不了解一下的话就看不懂大佬写的题解代码(鉴定为菜导致的\(\texttt{qwq}\))。类类(class)是结构体的拓展,不仅能够拥有成员元素,还拥有成员函数。在面向对象编程(OOP)中,对象就是类的实例,也就是变量。C++中struct关键字定义的也是类......
  • Python 框架学习 Django篇 (六) 数据表关联、ORM关联
    在后端服务器开发中,特别是前后端分离的架构中数据库是非常重要的,后端主要就是负责管理数据,而我们经常使用的mysql、oracle都是关系型数据库,什么是关系型数据库?就是建立在关系模型基础上的数据库,而最难处理的就是各个表之间的关联关系,一般这种关系分为三种:一对一、一对多、多对......
  • Python 框架学习 Django篇 (六) ORM关联
    像是上一章我们很少会通过页面点击去添加和绑定关系表,更多的时候都是通过django的语法实现,接下来我们做一个案例djangorom是怎么操作外键关系的创建mode模型表Django_demo/mgr/models.py#国家表classCountry(models.Model):name=models.CharField(max_length=100)#......
  • 运维工程师学习路线
    运维工程师在前期是一个很苦逼的工作,在这期间可能干着修电脑、掐网线、搬机器的活,显得没地位!时间也很碎片化,各种零碎的琐事围绕着你,很难体现个人价值,渐渐的对行业很迷茫,觉得没什么发展前途。这些枯燥无味工作的确会使人匮乏,从技术层面讲这些其实都是基本功,对后期的运维工作会无形中......
  • 2023-2024-1 20231414《计算机基础与程序设计》第5周学习总结
    学期(2023-2024-1)学号(20231414)《计算机基础与程序设计》第五周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2023-2024-1计算机基础与程序设计第五周作业)这个作业的目标<Pep/9虚拟机,......
  • 读高性能MySQL(第4版)笔记21_读后总结与感想兼导读
    1. 基本信息高性能MySQL:经过大规模运维验证的策略(第4版)HighPerformanceMySQL,FourthEdition[美] SilviaBotros(西尔维亚·博特罗斯);JeremyTinley(杰里米·廷利)电子工业出版社,2022年10月出版1.1. 读薄率书籍总字数471千字,笔记总字数50817字。读薄率50817÷47100......
  • 数字图像处理实验笔记
    实验一数学形态学图像处理实验内容与要求使用结构元素函数strel分别定义'square'和'disk'形状的结构元素,对下图(a)所示的二值图像进行腐蚀(imerode)和膨胀(imdilate)操作,分析腐蚀和膨胀运算的作用。结合腐蚀和膨胀运算,使用开运算(imopen)和闭运算(imclose),对下图(b)所示的二值图像......
  • python123 第二章:我的读书笔记
    print("后四位学号:3114")print("\n03")#03运行超市抹零结账行为‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪......
  • 2023-2024-1 20231320 《计算机基础与程序设计》第五周学习总结
    2023-2024-120231320《计算机基础与程序设计》第五周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2022-2023-1计算机基础与程序设计第五周作业)这个作业的目标<自学《计算机基础与......