P3 【并发】多处理器编程:从入门到放弃

并发(Concurrency)






foo的代码时共享的
全局变量x是共享的
每个线程的堆栈和寄存器是各个线程独享的


南大的这门课中老师写了一个threads.h,封装了POSIX的thread函数




这里create方法中,使用的是链表的头插法




可以在上图中看出,每个进程有8M的堆栈,并且每个堆栈之间有4K的分隔区

回答问题:刚创建线程时,只是标记了一下该线程分配了8M的堆栈,但是还没有进行实际的分配,所以创建了1000个线程并不会耗尽内存
hello-mt.c

放弃:放弃原有的概念和认识

多处理器编程:放弃(1)原子性


一条C语句可能拆分成多条指令

sum++一句C语言代码,可能被拆分成多条指令:

两个线程同时执行sum++,六条指令的执行顺序:①->②->③->④->⑤->⑥

多处理器编程:放弃(2)顺序性


-O1的优化:


按①②③④的顺序执行,③和④都是sum = n,for循环中都是空操作

-O2的优化:直接优化成了一条指令:sum = sum + n
由于并发性低,-O2的运行结果打印出了看似正确的结果

多处理器编程:放弃(3)可见性



如何保证顺序—例如使用volatile

如何保证原子性—互斥

如何保证可见性

总结





posted @ 2020-11-10 22:36  scnb  阅读(144)  评论(0)    收藏  举报