死锁
关于死锁概念当一组进程内的每个进程都在等待一个事件,而此事件只能由这组进程的另一个进程引起,那么这组进程处于死锁状态。死锁时,进程永远不能完成。
死锁达成的条件以下条件同时成立,死锁达成。
互斥:至少有一个资源为非共享的,一次仅供一个进程使用。
占有并等待:一个进程占有至少一个资源,并等待另一个资源,其被其他进程占有。
非抢占:资源不能被抢占
循环等待:一组进程中,一个进程占有一个资源并申请下一个被其他进程占有的资源,形成环时,就导致了循环等待。
资源分配图设Pi为进程,Vi为资源,Vi中的原点代表其中的实例个数。
Pi->Vi称为申请边,Vi->Pi称为分配边。
![image-20201125225056516]
当每个资源仅有一个实例时,出现环即说明出现死锁(或者说以原点为节点出现环时,出现死锁)。
如何避免死锁一种方法是使得死锁的四个必要条件之一不成立,另一种方法通过对资源的调度预防死锁。
1.如何避免以下条件成立互斥:互斥条件必须成立,因为可共享的资源不要求互斥访问,也就不会参与死锁。
占有并等待:保证进程申请一个资源时,它不能占有其他资源。
方法一:在 ...
数据结构速览
数据结构概览序列式数组1. 概述 将相同类型的元素存储于连续的空间,长度不可变。
初始化时需要给定长度同时对每一个索引元素赋值。
2. 可变数组 基于数组和扩容机制实现的数据结构,更为灵活。
STL的实现为vector。
3. vector 可变数组的STL实现,动态控件,随着新元素加入,内部机制会自行扩充空间以容纳新元素。
3.1 迭代器 普通指针都可以作为vector的迭代器并且满足所有必要条件,像vector支持的随机存取,普通指针本就具备,所以vector提供Random Access Iterators。
3.2 vector的数据结构
vector采用连续线性空间,使用两个迭代器start与finish分别指向配置得来的连续空间中已经被使用的范围,并且用迭代器end_of_storage指向整块连续空间(含备用空间)的尾端。
容量(capacity)代表vector整块连续空间的大小,容量总是大于或等于vector的大小,一定容量等于大小,vector即满载,下次新增元素时,容量便扩充至两倍, ...
通过unity实现一个3d的黑白棋游戏
Unity实现3D黑白棋 大三上学期的期末,课程设计课要求从清单中选择一个项目,完成从需求分析到开发实现的所有步骤。清单中的项目大多是某某管理系统,但是最后一个项目是黑白棋游戏,于是在得到老师的可以使用游戏引擎开发的许可后,我们小组的项目定为3D黑白棋。
做3D的原因是本身黑白棋有许多2d的实现,再一个我希望通过这个项目来熟悉Unity3D游戏的制作。
资源导入 游戏使用的资源来自Asset Store,搜索Board games可以找到这样一个免费的资源包,包括了一个8*8棋盘与黑白棋子和对应的纹理。
框架的搭建 游戏仅通过3个C#脚本来控制,分别为ChessController,ChessManager,GameManager.
棋子的预制体会在游戏开始时,克隆至棋盘的每一个格子上,并将自身对象设置为false,棋子预制体一开始便会按顺序添加到ChessManager中的二维数组中,方便后续操作。
Chess概览
1234567891011121314151617181920212223242526272829303132333435 ...
C++学习笔记
C++ 学习笔记关于函数使用指针处理数组大多数情况下C++将数组名视为指针。
例外:
1.数组声明用数组名来标记存储位置。
2.对数组名使用sizeof将得到整个数组的长度。
3.将地址运算符&用于数组名时,返回整个数组的地址。
仅在用于函数头或者函数原型中,下面声明的意义相同。
12typename *variable;typename variable[];
将数组作为参数1.传递数组时,函数将使用原来的数组(即传递的时地址)。
2.通过数组名与指针对应,将数组地址作为参数可以节省复制整个数组所需要的时间与内存。
3.接受数组参数的函数中,对参数名使用sizeof只能得到指针变量的长度。
将const用于指针1.禁止将const地址赋值给非const指针,因为这样可以通过指针去修改const变量。
2.仅有一层间接关系时,才可以将非const地址或指针赋值给const指针,否则将不安全。
3.尽可能使用const:避免由于无意间修改数据而导致的编程错误;
使用const使得函数可以同时处理const和非const实参;
使用const引用使函数能正确生成并使 ...