1.多处理器编程入门
在多个CPU核心下,多线程的好处是显而易见的,不然多个CPU核心只跑一个线程其他的核心就都浪费了。
即便不考虑多核心,在单核下,多线程也是有意义的,因为在一些操作,比如IO操作阻塞的时候,是不需要CPU参与的,这时候CPU就可以另开一个线程去做别的事情,等待IO操作完成再回到之前的线程继续执行即可。
同一个线程组内线程间共享虚拟内存
思考:如果线程非常非常多,会发生什么情况?
CPU会在N多线程之间调度,CPU会类似,消耗大量的CPU资源;每条线程被调度执行的频次会较低(线程的执行效率减低)。一般开到3-5条线程。
多任务操作系统,每隔一小段时间从一个进程切换到另一个进程,因此看起来进程是同时执行。
操作系统并发的来源,是系统调用
。也就是进程虽然地址空间被隔离,但执行过程不是完全没有影响,而是进程在执行中,会通过系统调用访问操作系统的API,而操作系统的对象是共享的。例如:
foo的代码共享,全局变量x共享。
除了代码和全局变量,每个线程的堆栈和寄存器都是他们独享的。
threads.h
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <pthread.h>
struct thread{
int id; //线程号
pthread_t thread; //pthread线程
void (*entry)(int); //入口地址
struct thread *next;//链表
};
struct thread *threads;
void (*join_fn)();
// ============ Basics =============
__attribute__((destructor)) static void join_all(){
for (struct thread *next; threads; threads = next){
pthread_join(threads->thread,NULL);
next = threads->next;
free(threads);
}
join_fn ? join_fn() : (void)0;
}
static inline void *entry_all(void *arg){
struct thread *thread