多线程编程指南

不变量和锁定

对于代码锁定和数据锁定,不变量对于控制锁定复杂性非常重要。不变量指始终为真的条件或关系。

对于并发执行,其定义修改如下(在上述定义的基础上稍加修改即可得到此定义):不变量是在设置关联锁定时为真的条件或关系。设置锁定后,不变量可能为假。但是,在释放锁之前,持有锁的代码必须重新建立不变量。

不变量还可以是设置锁定时为真的条件或关系。条件变量可以被认为含有一个不变量,而这个不变量就是这个条件。


示例 9–4 使用 assert(3X) 测试不变量

    mutex_lock(&lock);

    while((condition)==FALSE)

        cond_wait(&cv,&lock);

    assert((condition)==TRUE);

      .

      .

      .

    mutex_unlock(&lock);

assert() 语句用于测试不变量。cond_wait() 函数不保留不变量,这就是在线程返回时必须重新评估不变量的原因所在。

另一个示例就是用于管理双重链接的元素列表的模块。对于该列表中的每一项,良好的不变量是列表中前一项的向前指针。向前指针还应与向前项的向后指针指向同一元素。

假设此模块使用基于代码的锁定,进而受到单个全局互斥锁的保护。删除或添加项时,将获取互斥锁,正确处理指针,而且会释放互斥锁。显然,在处理指针的某一时间点,不变量为假,但在释放互斥锁之前,需要重新建立不变量。