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
");
}
多线程
终止
- 终止某个线程而不终止整个进程
- 从线程函数
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
查看系统有的组,再将脚本中的组名改为系统有的组。
学习总结
- 前两周因为实验太多,一直没写博客,落下了很多
- 一些课上测试由于上课来不及做完,课后也花了时间去研究
- 还是需要认真学习,一旦落下课程就需要花更多时间去弥补