(完整!)2017-11-1 第七次 信息安全系统设计基础课 主要内容

第六次课考了一节课的试,什么也没讲,这篇随笔整理的是第七周老师上课讲的“线程”方面的内容

大家要是看过我以前的笔记整理博客,就应该能知道,

这个框框里的是老师的原话,

框框以外的是我对老师思路的解读,要是比较重要的地方我会写出重要!
有的老师上课输入的代码或者比较重要的代码我会写在这个小框框里面,

本次课老师讲的是第12章内容:并发编程。

我们今天讲的内容分为两个方面:
1.万能函数
2.多线程

其实今天的主要内容就是一个,老师以万能函数为例,并且以万能函数作为引入, 主要介绍多线程。

我们学习的东西可以用来应付考试,也可以用来应用实践,就像你英语学好了,你就多了一个“世界”,我们学习编程,最好能解决实际问题
并发在操作系统中很重要,原来万用表等等,很多的系统都不用并发, 现在万用表都用并发了。
有三种并发的实例:
1.程序间的并发:进程
2.函数级的并发:线程
3.(老师没讲但是我问了狄惟佳)I/O多路复用(当然不要求掌握)

老师现在先讲了一下程序间的并发,也就是进程并举例。

进程之间虚拟内存本来是隔离的,但是有IPC(Inter-Process Communication,进程间通信)可以实现进程间的通信,可以实现并发,但是函数之间没有这个协议,要是我想实现函数级的并发怎么办呢?

然后老师开始讲函数级并发了。

函数级并发我们将其称之为“线程”,函数之间的并发不是“谁调用谁”的问题了,
我们写程序时用的模块分为两个部分:
(等等,先提问一下什么是模块?答:一个.c就是一个模块)
(学任何编程语言都是这么一招,分模块来写)
1.接口
2.实现
接口用来指明函数做什么,而实现指明模块如何完成接口,一个接口可以有多个实现,接口是函数的调用者,实现是函数的实现者。

举例:如何写一个“求两个整数的和”的接口?要用c语言书写。

然后老师提示:只需要写参数返回值、而不能写在main里,写在main里就直接调用了,
然后老师写出了一种:

int sum(int 加数,int 被加数);return (加数+被加数);

其中int sum(int 加数,int 被加数)叫做函数的签名

老师扩展了一下知识:只要函数名相同,参数相同,类型相同,就算作同一个签名。

我们上面写的这个就算UNIX风格的写法,相同的,要是是这种写法:
(int sum ,int 加数,int 被加数,int *sum); *sum=加数+被加数
这种的就是POSIX风格的写法, 因为所有的输入输出都是参数搞定的。函数的返回值为0或1,只表示正确或者错误

好,现在大家写十种接口,不能重复。写出6种算合格,写完了拍照片发蓝墨云。

(大约尴尬了五分钟左右,老师开腔了)
十种可以怎么写啊?
数组可以吧?参数可以存放在数组里,
结构体也可以吧?
用一个指针、两个指针、三个指针都可以吧?
然后老师给给出了下面这张图,

注意:引入部分到此结束,接下来开始讲第一个内容:万能函数

所有函数都可以用结构体和指针代替,所以我们引出了万能函数,即void *就可以将接口转化为任意类型。

万能函数:
void *func (void *parameter); typedef void *(*uf) (void *para);
其中,(*uf)是万能函数的指针

啊注意,然后老师就开始讲多线程了!

什么是单线程?看下面这个例子:

提问:这个函数输出是什么?
某人答:print
追问:输出几个print?打了几遍?
某人答:一遍
旭哥:五遍
然后老师说:旭哥说的对啊,hello打了五遍,world打了五遍。(有个sleep(1),他的意思是每次执行完程序之后休眠1秒,所以打印十次,休眠十秒。)

但是如果把函数做成并发的话,hello和world的顺序就不好确定了。
有什么区别呢?
1.头文件变了,变成include <pthread.h>
2.调用函数变成使用万能函数了。

提问:这个函数有几个线程?
答案:三个,因为两个pthread_creat和一个main,别忘了main也算一个线程。

使用pthread_join可以等待子进程全部执行完之后再结束。要是没等子进程执行完就结束的话程序就崩了。

然后老师输入gcc -pthread hello_multi.c -o hp将多线程的代码编译了一下:

time可以看程序的执行时间,输入time ./hp发现:两个程序并发了,即“你休眠我进行”,并发之后程序执行用了5s,这样就节省了时间。

然后老师用多线程对变量依次加一,共加了5000次,本来答案应该是1万,可是程序显示答案数值还不到6000,

为什么呢?哪里错了呢?
这就涉及到了“同步&互斥”问题。要用PV原理解决“同步&互斥”导致的资源不足问题。

接下来老师简单讲解了一下什么是同步,什么是互斥。

什么是互斥?同时刻只能有一个人使用。那什么是同步?同步显然是互斥的特例。
互斥问题和我们到商场存包很类似,存包的时候使用资源,存完包之后要释放资源给别人用,所以根据PV原理,先P一下把柜子锁起来,用完柜子之后V一下释放掉,给别人来用。

那刚刚那个问题怎么解决?
加了一个pthread_mutex_unlock函数,程序来了先锁一下,

之后是什么效果?之后就对了,答案变成1万了。互斥问题我们用“锁”解决,同步问题用“信号量”解决。

大家看一下书上的“读写模型”和“生产者&消费者”模型,然后做蓝墨云上的新练习。

结束

原文地址:https://www.cnblogs.com/zhuanyedajiesanshinian/p/7770822.html