三、多处理器编程

本文介绍了多处理器编程中的多线程概念,阐述了多线程在多核和单核环境下的优势。讨论了线程过多可能导致的CPU调度问题,并解释了操作系统如何实现并发。文章通过实例展示了线程间的内存共享,指出了线程安全的重要性,以及编译器优化在并发环境中的影响。最后,提出了并发编程中的原子性和同步问题。
摘要由CSDN通过智能技术生成

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值