1、堆栈类模板实现:
#ifndef MYSTACK_H
#define MYSTACK_H
#include <iostream>
using namespace std;
template <typename T>
class MyStack
{
public:
MyStack(int size);
~MyStack();
bool stackEmpty();//判空
bool stackFull();//判满
void clearStack();//清空
int stackLength();//长度
bool push(T elem);//压栈
bool pop(T &elem);//出栈
bool stackTop(T &elem);//返回栈顶
void stackTranverse();//遍历栈
private:
T *m_pStack;//栈指针
int m_iSize;//栈容量
int m_iTop;//栈顶
};
### 栈初始化
template <typename T>
MyStack<T>::MyStack(int size)
{
m_iSize = size;
m_pStack = new T[m_iSize];
m_iTop = 0;
}
### 压栈
template <typename T>
bool MyStack<T>::push(T elem) {//压栈
if (stackFull()) {
return false;
}
else {
m_pStack[m_iTop++] = elem;
return true;
}
}
### 出栈
template <typename T>
bool MyStack<T>::pop(T &elem) {//出栈
if (stackEmpty())
{
return false;
}
else {
elem = m_pStack[--m_iTop];
return true;
}
}
2、锁、互斥锁、原子锁、CSC
临界资源、互斥锁mutex,对于临界资源谁使用他谁就给他加锁
在原子操作过程中不会引起线程切换出现问题,保证临界资源被唯一访问。
自旋锁会一直等待直到锁被释放,避免CPU上下文线程切换引起的开销。
如果访问时间较短的话可以选用spin自旋锁,访问时间较长的话选择mutex互斥锁
volatile关键字对于变量值每次从内存中重现读取,解决多进程之间的并发问题、原子操作对应汇编指令集中的一条操作,比如i++可以用xadd来代替
同理,cas(compared and swap)体现的也是一种基本的原子操作
if a==b ,a=c ;cas(A,B,C),对应汇编指令compxhg,可以在单例模型中嵌套使用
3、