锁,信号量,条件变量-unix课程的个人体会
锁:
只是将原来由信号量的value改成现在的 cheld(bool) 开始用false表示没锁 接下来 Acquier()后就有锁 当release()后重新获得锁 --释放锁 其余的改变主要是条件变量是要用到 isheldbycurrenThread() 用到保存当前线程的cheldThread线程变量指针.
条件变量: wait(); 直接添加进条件变量的队列 锁放开 睡觉 锁的获得(竞争锁) signal();
条件变量不会向锁一样需要死循环的等到能进入缓冲区所以释放不需要改变 value与cheld的值以让别人不需要死循环或 判断是否需要执行与 判断该是否还可以执行。
信号量与锁与条件变量的差别: 通过信号量与 cheld cheldthread 作为锁 通过 通过记录队列里面的线程个数来判断是否该还能够出队列
用信号量实现是初始值为0 因为只要p()就要让他直接阻塞掉。
缓冲区:
类分别为: Lock Condition lock->Acquire(); lock->Release(); BufferEmpty->Wait(lock); BufferFull->Signal(lock);
一个锁lock 两个条件变量BufferEmpty BufferFull 缓冲区最大值:BufferSize 缓冲区实际值:number 缓冲区数组:Buffer[] 缓冲区标志 element[]; free指针方法: delete
构造:初始化 析构:free指针
读缓冲区:一次读 size个 读后要把标志变为0 void BoundedBuffer::Read(void *data, int size) // read 'size' bytes from the bounded buffer, storing into 'data'. // ('size' may be greater than 'maxsize') 锁临界区 循环里用双指针用以说明 边界与读取的个数 为空时 i重新为0 判断空 阻塞本线程,挂到空条件变量队列里
不空时 如果原来是满状态, 则发信号给等在满队列里的线程。
关掉临界区
写缓冲区 写后要把标志变为1 void BoundedBuffer::Write(char *data, int size) // write 'size' bytes from 'data' into the bounded buffer. // ('size' may be greater than 'maxsize') 锁临界区 判断满状态 i重新从0开始 否则的话读取字符到data 里面 当缓冲区里面的数据个数加了1后是1时 发信号给空条件变量的队列 写缓冲区
table类:
Lock lock int size void **list(具体用来存放内容) 表里面包含: 一个锁:Lock void *L(作为一个线性指针表) int Size表大小
~Table() //析构函数 Re 自己的全部值 删除两个指针 Table(int size); // create a table to hold at most 'size' entries. 初始化表元素个数 int Alloc(void *object);//分配单元的函数 还回正确序号 void *Get(int index);//确定单元地址的函数 由序号到指针 void Release(int index);//释放序号上面的值