多线程编程指南

嵌套锁定和循环链接列表的示例

示例 4–6 通过将以前的列表结构转换为循环列表来对其进行修改。由于不再存在用于标识的头节点,因该线程可以与特定的节点相关联,并可针对该节点及其邻居执行操作。锁分层结构在此处不适用,因为链接之后的分层结构明显是循环结构。


示例 4–6 循环链接列表结构

typedef struct node2 {

    int value;

    struct node2 *link;

    pthread_mutex_t lock;

} node2_t;

以下的 C 代码用来获取两个节点上的锁并执行涉及到这两个锁的操作。


示例 4–7 循环链接列表和嵌套锁定

void Hit Neighbor(node2_t *me) {

    while (1) {

        pthread_mutex_lock(&me->lock);

        if (pthread_mutex_lock(&me->link->lock)!= 0) {

            /* failed to get lock */             

            pthread_mutex_unlock(&me->lock);              

            continue;         

        }         

        break;     

    }     

    me->link->value += me->value;     

    me->value /=2;     

    pthread_mutex_unlock(&me->link->lock);     

    pthread_mutex_unlock(&me->lock);

}