系列综述:
目的:本系列是个人整理为了秋招项目
的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
来源:该项目源于国科大并发数据结构和多核编程
的课程作业
结语:如果有帮到你的地方,就点个赞和关注一下呗,谢谢!!!
项目github链接
【C++】秋招&实习面经汇总篇
本实验是并发数据结构与多核编程课程的实验作业,并以学习的并发编程相关知识为基础,完成了该实验作业项目。具体计划及完成时间为:
实验具体要求的研读 2021.11.26
实验相关并发知识的深入理解 11.27~11.28
理解项目并进行实验环境的搭建 11.29~11.30
非并发的单线程串行项目的实现 12.1
基于粗粒度锁的并发数据结构的实现 12.2
基于细粒度锁的并发数据结构的实现 12.3
基于乐观锁的并发数据结构的实现及实验报告的编写 12.4
最终,实验项目实现了基于乐观锁的并发数据结构,性能较细粒度锁提升不大,可能是受到笔记本性能的限制,但是吞吐率上下波动更小,并且在测试过程中,未出现并发线程增加而吞吐率下降的现象。
正确性分析
流程分析
项目按照老师上课讲解的递进式开发,从最简单的锁一步一步进行高性能并发程序的编写:
并发数据结构锁的性质
deadlock-free
由于使用的是CAS,这是一种乐观锁算法,实质是基于版本的校验,并不对线程进行加锁,所以也不会导致死锁的现象。
starvation-free
线程执行CAS进行列车座位区间的修改,并不会导致出现无限等待,即每个线程一定会在有限步内完成,所以是无饥饿的。
lock-free
每个线程进行操作无论成功与否一定会在有限步内完成,进程之间的竞争也一定会有胜出者完成事务的处理,所以满足无锁
wait-free
系统中的所有线程,都会在有限时间内结束,无论如何也不可能出现饿死的情况,乐观锁保证了系统中的所有线程都能处于工作状态,没有线程会被饿死,只要时间够,所有线程都能结束。
给定Ticket
类:
class Ticket{
long tid;
String passenger;
int route;
int coach;
int seat;
int departure;
int arrival;
}
其中,tid
是车票编号,passenger
是乘客名字,route
是列车车次,coach
是车厢号,seat
是座位号,departure
是出发站编号,arrival
是到达站编号。
给定TicketingSystem
接口:
public interface TicketingSystem {
Ticket buyTicket(String passenger, int route, int departure, int arrival);
int inquiry(int route, int departure, int arrival);
boolean refundTicket(Ticket ticket);
}
其中:
buyTicket
是购票方法,即乘客passenger
购买route
车次从departure
站到arrival
站的车票1张。若购票成功,返回有效的Ticket
对象;若失败(即无余票),返回无效的Ticket
对象(即return null
)。refundTicket
是退票方法,对有效的Ticket
对象返回true
,对错误或无效的Ticket
对象返回false
。inquriy
是查询余票方法,即查询route
车次从departure
站到arrival
站的余票数。TicketingDS
类完成一个用于列车售票的可线性化并发数据结构:TicketingDS
类:
TicketingSystem
接口,TicketingDS(routenum, coachnum, seatnum, stationnum, threadnum);
构造函数。其中:
routenum
是车次总数(缺省为5个),coachnum
是列车的车厢数目(缺省为8个),seatnum
是每节车厢的座位数(缺省为100个),stationnum
是每个车次经停站的数量(缺省为10个,含始发站和终点站),threadnum
是并发购票的线程数(缺省为16个)。为简单起见,假设每个车次的coachnum
、seatnum
和stationnum
都相同。
车票涉及的各项参数均从1开始计数,例如车厢从1到8号,车站从1到10编号等。
需编写多线程测试程序,在main
方法中用下述语句创建TicketingDS
类的一个实例。
final TicketingDS tds = new TicketingDS(routenum, coachnum, seatnum, stationnum, threadnum);
系统中同时存在threadnum
个线程(缺省为16个),每个线程是一个票务代理,需要:
TicketingDS
类的三种方法若干次需要最后给出:
需要保证以下正确性:
tid
,不能重复。tid
的车票只能出售一次。退票后,原车票的tid
作废。所有Java程序放在ticketingsystem
目录中,trace.sh
文件放在ticketingsystem
目录的上层目录中。
如果程序有多重目录,那么将主Java程序放在ticketingsystem
目录中。
文件清单如下:
TicketingSystem.java
是规范文件,不能更改。Trace.java
是trace生成程序,用于正确性验证,不能更改。trace.sh
是trace生成脚本,用于正确性验证,不能更改。TicketingDS.java
是并发数据结构的实现。Test.java
实现多线程性能测试。程序放在ticketingsystem
目录中。
文件清单如下:
TicketingSystem.java
是规范文件,不能更改。Trace.java
是trace生成程序,用于正确性验证,不能更改。trace.sh
是trace生成脚本,用于正确性验证,不能更改。TicketingDS.java
是并发数据结构的实现。Test.java
实现多线程性能测试。