鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

使用锁进行多线程并发控制时,确保锁生效区间最小化

【说明】 多线程编程时,如果需要采用加锁的方式进行共享资源访问等线程同步操作时,需要将与共享资源访问无关的部分从加锁范围中剥离,避免带来性能损失。

【原理】 采用锁的方式进行线程同步的多线程运行环境下,如果锁被某一线程占用,其他线程尝试加锁会被挂起;极端情况下,如果所有线程都被挂起,多线程会退化成单线程运行,此时系统的性能会明显下滑,因此,加锁区间的最小化能够避免锁冲突的概率,减少线程挂起和等待时长。

【注意事项】 不涉及

【案例】

优化前
void FuncDoSomethingWithMutex()
{
    Mutex &mutex = GetResourceRMutex();
    
    mutex.Lock();
    VisitResourceS();
    VisitAndModifyResourceR();
    mutex.Unlock();
    return;
}

说明:FuncDoSomethingWithMutex函数内部实现时,访问了资源S和资源R,其中,对资源R的访问采用加锁的方式进行控制。当前的加锁范围包含了对资源S和资源R的访问过程,实际上,资源S不需要通过锁进行控制,未做到锁生效区间的最小化

优化后
void FuncDoSomethingWithMutex()
{
    Mutex &mutex = GetResourceRMutex();
    
    VisitResourceS();

    mutex.Lock();
    VisitAndModifyResourceR();
    mutex.Unlock();
    return;
}

说明: 经过优化的FuncDoSomethingWithMutex函数,其加锁区间仅包括对资源R的访问过程,实现了锁区间最小化。