第四章学习笔记
信息安全系统设计与实现
第四章 并发编程
并行计算导论
1、顺序算法与并行算法
2、并行性与并发性
线程
1、线程的原理
线程是某进程同一地址空间上的独立执行单元。创建某个进程就是在一个唯一地址空间创建一个线程。当某进程开始时,就会执行该进程的主线程。如果只有一个主线程,那么进程和线程实 际上并没有区别。但是, 主线程可能会创建其他线程。 每个线程又可以创建更多的线程等。 某进程的所有线程都在该进程的相同地址空间中执行, 但每个线程都是一个独立的执行单元。
2、线程的优点
线程创建和切换速度更快、响应速度更快、更适合并行计算
3、线程的缺点
由于地址空间共享,线程需要来自用户的明确同步、许多库函数可能对线程不安全、在单cpu系统上,使用线程解决问题实际上比使用顺序程序慢,这是由在运行时创建线程和切换上下文的系统开销造成的线程操作
线程操作
线程管理函数
int prhread_create (pthread_t *pthread_id,pthread_attr_t *attr,
Void *(*func)(void *), void *arg);
1、创建线程
2、线程ID
int pthread_equal (pthread_t t1, pthread_t t2);
3、线程终止
int pthread_exit (void *status);
4、线程连接
int pthread_join (pthread_t thread,void **status_ptr);
线程示例程序
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();
row = (int)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);
}
int main(int argc,char *argv[]){
pthread_t thread[N];
int i,j,r,total=0;
void *status;
printf("Main:initize 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 thread\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 toatal sum: ");
for(i=0;i<N;i++)
total+=sum[i];
printf("total =%d\n",total);
pthread_exit(NULL);
}
2、用线程快速排序
线程同步
1、互斥量
静态方法
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER
动态方法
pthread_mutex_init(pthread_mutex_t *m,pthread_mutexattr_t,*attr);
2、死锁预防
3、条件变量
4、生产者-消费者问题
5、信号量
6、屏障
7、用并发线程解线性方程组
8、Linux中的线程
编程项目:用户级线程
1、项目基本代码:一个多任务处理系统
2、用户级线程
3、线程连接操作的实现
4、互斥量操作的实现
5、用并发程序测试有互斥量的项目
6、信号量的实现
7、使用信号量实现生产者-消费者问题
学习心得
本章论述了并发编程,介绍了并行计算的概念,指出了并行计算的重要性;比较了顺序算法与并行算法,以及并行性与并发性;解释了线程的原理及其相对于进程的优势;通过示例介绍了 Pthread 中的线程操作,句括线程管理函数。互斥量、连接、条件变量和屏障等线程同步工具;通过具体示例演示了如何使用线程进行并发编程,包括矩阵计算、快速排序和用并发线程求解线性方程组等方法;解释了死锁问题,并说明了如何防止并发程序中的死锁问题;讨论了信号量,并论证了它们相对于条件变量的优点;还解释了支持Linux 中线程的独特方式。编程项目是为了实现用户级线程。它提供了一个基础系统来帮助读者开始工作。这个基础系统支持并发任务的动态创建、执行和终止,相当干在某个进程的同一地址空间中执行线程。读者可通过该项目实现线程同步的线程连接、互斥量和信号量,并演示它们在并发程序中的用法。该编程项目会让读者更加深入地了解多任务处理、线程同步和并发编程的原理及方法。