Code Example 3-3 条件锁
Thread 1:
Mutex_lock(&m1);
Mutex_lock(&m2);
Mutex_unlock(&m2);
Mutex_unlock(&m1);
Thread 2:
For(;;){
Mutex_lock(&m2);
If(mutex_trylock(&m1)==0)
/*got it*/
break;
/*didn't get it */
mutex_unlock(&m1);
}
mutex_unlock(&m1);
mutex_unlock(&m2);
在上例中,线程1按照预定的顺序加锁,但线程2打乱了次序。为避免死锁,线程2必须小心操作互斥锁1:如果设置在等待互
斥锁释放时阻塞,则可能导致死锁。
为保证上述情况不会发生,线程2调用mutex_trylock,如果互斥锁可用则用, 不可用则立刻返回失败。在这个例子当中,线程
2一定要释放互斥锁2,以便线程1 可以使用互斥锁1和互斥锁2。
3.1.7锁内嵌于单链表当中
示例3-4同时占有3个锁,通过锁等级定义避免死锁。
Code Example 3-4 单链表结构
Typedef struct node1{
Int value;
Struct node1 *link;
Mutex_t lock;
}node1_t;
node1_t Listhead;
此例利用单链表结构的每一个节点存储一个互斥锁。为了删除一个互斥锁,要从listhead开始搜索(它本身不会被删除),知
道找到指定的节点。
为了保证同时删除不会发生,在访问其内容之前要先锁定节点。因为所有的搜索从listhead开始按顺序进行,所以不会出现死
锁。
如果找到指定节点,对该节点和其前序节点加锁,因为两个节点都需要改变。因为前序节点总是首先加锁,死锁将不会发生。
下面C程序从单链表中删除一项。
Code Example 3-5 内嵌锁的单链表
Node1_t * delete(int value){
Node1_t * prev, *current;
Prev =&listhead;
Mutex_lock(&prev->lock);
While((current=prev->link)!=NULL){
Mutex_lock(¤t->lock);
If(current->value==value){
Prev->link=current->link;
Mutex_unlock(¤t->lock);
Mutex_unlock(&prev->lock);
Current->link=NULL;
Return(current);
}
mutex_unlock(&prev->lock);
prev=current;
}
mutex_unlock(&prev->lock);
return(NULL);
}
3.1.8内嵌在环状链表中的锁