2019-2020-1 20175310 《信息安全系统设计基础》第九周学习总结
2019-2020-1 20175310 《信息安全系统设计基础》第九周学习总结
多线程
万能函数
void * func( void * parameter)
typedef void* (*uf)(void * para)
接口
- 指明模块要做什么
- 标识符、类型、函数等
- *.h
- 函数调用者
实现
- 指明模块如何完成接口
- 一个接口多个实现(可能)
- *.c
- 函数实现者

函数签名(Function Signature)
- 函数名、它的参数个数,参数类型
- 注意不包含返回值
- 函数签名用于识别不同的函数,就像签名用于识别不同的人一样
多线程
单线程

并发
- 程序级并发—进程
- 函数级并发—线程
sayhello1.c
#include <stdio.h>
#define NUM 5
void print_msg(char *m)
{
int i;
for (i=0;i<NUM;i++){
printf("%s",m);
fflush(stdout);
sleep(1);
}
}
int main(){
print_msg("hello");
print_msg("world\n");
}

多线程

终止
- 终止某个线程而不终止整个进程
- 从线程函数
return - 调用
pthread_cancel终止同一进程中的另一个线程 - 调用
pthread_exit终止自己

pthread_join 得到的终止状态:
- 如果
thread线程通过return返回,value_ptr所指向的单元里存放的是thread线程函数的返回值 - 如果
thread线程被别的线程调用pthread_cancel异常终止掉,value_ptr所指向的单元里存放的是常数PTHREAD_CANCELED - 如果
thread线程是自己调用pthread_exit终止的,value_ptr所指向 的单元存放的是传给pthread_exit的参数


临界资源
- 一次仅允许一个进程(线程)使用的资源
- 打印机、变量、数据等
互斥
- 间接制约关系
- 当一个进程进入临界区使用临界资源时,另一个进程(线程)必须等待, 当占用临界资源的进程退出临界区后,另一进程才允许去访问此临界资源。

同步
- 直接制约关系
- 为完成某种任务而建立的两个或多个进程(线程),这些进程(线程)因为需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系。

互斥锁Mutex,Mutual Exclusive Lock
- 获得锁的线程可以完成“读-修改-写”的操作,然后释放锁给其它线程
- 没有获得锁的线程只能等待而不能访问共享数据
- “读-修改-写”三步操作组成一个原子操作,要么都执行,要么都不执行,不会执行到中间被打断,也不会在其它处理器上并行做这个操作
Mutex用pthread_mutex_t类型的变量表示



线程与进程
| 功能 | 进程 | 线程 |
|---|---|---|
| 创建 | fork | pthread_create |
| 等待 | wait/waitpid | pthread_join |
| 终止 | exit/_exit | pthread_exit |
| ID | getpid/getppid | pthread_self |
| 互斥 | semaphore | mutex/semaphore |
| 同步 | semaphore | cond var/semaphore |
代码调试中的问题
- 遇到的问题1:运行多线程代码时报错
对‘pthread_create’未定义的引用
对‘pthread_join’未定义的引用

-
解决方案:在编译时加一个参数
-lpthread就可以了


-
遇到的问题2:

-
解决方案:
ls -l test_drv_load查看系统有的组,再将脚本中的组名改为系统有的组。


学习总结
- 前两周因为实验太多,一直没写博客,落下了很多
- 一些课上测试由于上课来不及做完,课后也花了时间去研究
- 还是需要认真学习,一旦落下课程就需要花更多时间去弥补

浙公网安备 33010602011771号