第四章学习笔记

信息安全系统设计与实现

第四章 并发编程

并行计算导论

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 中线程的独特方式。编程项目是为了实现用户级线程。它提供了一个基础系统来帮助读者开始工作。这个基础系统支持并发任务的动态创建、执行和终止,相当干在某个进程的同一地址空间中执行线程。读者可通过该项目实现线程同步的线程连接、互斥量和信号量,并演示它们在并发程序中的用法。该编程项目会让读者更加深入地了解多任务处理、线程同步和并发编程的原理及方法。

posted @ 2021-10-31 21:58  dky20191311  阅读(25)  评论(0编辑  收藏  举报