文档库

最新最全的文档下载
当前位置:文档库 > priority donate 三种实现方法

priority donate 三种实现方法

Priority-Donation 的三种方法

作者:西安电子科技大学王永刚QQ:357543420

要考虑的情况:

定义以下优先级H2>H1>L

在struct thread中加入

Bool Donated; //是否接受过捐献

Struct list LockList; //占有的锁

Int OldPri; //原来的优先级

在struct lock中加入

Struct list_elem elem; //用于插入链表

Int priority; //因为这个锁捐献的最高优先级

Struct lock BlockReason;

//多个不同优先级的线程申请同一个锁,在锁中只保存最高优先级

情况一:单一捐献

1.设X线程优等级L,申请”锁A”,申请时,在“锁A”中保存”X线程”的struct

thread *指针到”锁A”的holder的变量中。也就是记录了占有锁A的线程;

锁没被任何线程占,则为NULL). 得到锁A, X线程处于ready状态

把A锁加入X线程的LockList中;

A->priority=x->priority;

List_insert_ordered(&x->LockList,&A->elem);

2.“线程Y”开始运行,优先级为H1,申请”锁A”

发现锁A 被X线程占有,且H1>L, 所以捐献优先级:

1.如果X没接受过捐献,保存X原来的优先级;否则把X的优先级改为

H1

If(H1>A->priority)

A->priority=H1;

If(H1>X->priority)

{

If(!Donated)

{

Donated=true;

X->OldPri=x->priority;

}

X->priority=H1;

}

2.保存锁A 到X线程中

List_remove(&A->elem);

List_insert_ordered(&x->LockList,&A->elem);