12.线程(二)
一.上集回顾
建议先学上篇博客,再向下学习,上篇博客的链接如下:
https://blog.csdn.net/weixin_60668256/article/details/154519900?fromshare=blogdetail&sharetype=blogdetail&sharerId=154519900&sharerefer=PC&sharesource=weixin_60668256&sharefrom=from_link
二.多级页表
1.多级页表的讲解










![]()

然后从MMU里面出来的就是物理地址
![]()
硬件快,所以要硬件自动完成



也就是说,我们有一个创建一个轻量级线程,只要给这个线程一个函数的入口地址就可以了
2.补充TLB缓存



重复的访问,就可以进行优化,减少时间消耗







直接执行中断逻辑(默认处理方法),然后将其处理即可


三.线程的优点

线程创建的个数一般都等于CPU个数*核数
线程的优势是前三点
TLB缓冲的是虚拟到物理地址的映射,cache缓存的是代码和数据块(进程间切换,前面都会失效,但是线程间切换不会失效)


四.线程的缺点

五.线程异常

六.线程用途

七.线程vs进程
1.进程和线程

2.进程的多个线程共享

八.线程控制
1.POSIX线程库

2.创建线程









#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <pthread.h>void* routine(void* args)
{std::string name = static_cast<const char*>(args);while(true){std::cout << "我们是新线程,我的名字是: " << name << std::endl;sleep(1);}return 0;
}int main()
{pthread_t tid;int n = pthread_create(&tid,nullptr,routine,(void*)"thread-1");if(n != 0){std::cout << "create thread error: " << strerror(n) << std::endl;return 1;}while(true){std::cout << "我们是主线程..." << std::endl;sleep(1);}return 0;
}
"makefile"mythread:mythread.ccg++ -o $@ $^ -std=c++11 -lpthread
.PHONY:clean
clean:rm -rf mythread
pthread库属于第三方库,我们要加对应的-l选项


#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <pthread.h>
#include <thread>int main()
{std::thread t([](){while(true){std::cout << "我们是新线程,我的名字是: new thread" << std::endl;sleep(1);}});while(true){std::cout << "我们是main线程..." << std::endl;sleep(1);}return 0;
}


![]()
