教材知识点总结
并行计算导论:
-
顺序算法与并行算法:顺序算法是按照一定的顺序执行的算法,而并行算法是可以同时执行多个任务的算法。并行算法可以通过将任务分解为多个子任务并行执行来提高计算效率。
-
并行性与并发性:并行性是指多个任务同时进行,而并发性是指多个任务交替进行。并行性可以通过硬件的并行处理能力来实现,而并发性则是通过操作系统的调度机制来实现。
线程:
-
线程的原理:线程是操作系统中最小的执行单位,它是进程的一部分,共享进程的资源。线程可以独立执行,并且可以与其他线程共享数据。
-
线程的优点:线程可以提高程序的响应速度和处理能力,可以充分利用多核处理器的并行处理能力,可以更好地利用系统资源。
-
线程的缺点:线程之间共享资源可能会导致竞争条件和数据不一致的问题,线程的创建和销毁需要一定的开销。
线程操作:
-
创建线程:可以使用线程库提供的函数来创建线程,例如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