C++11--锁分析

发布于:2025-07-23 ⋅ 阅读:(19) ⋅ 点赞:(0)

1 介绍

互斥量(mutex)类型,用于线程同步,防止数据竞争(data race)。

2 锁嵌套问题

示例

class Motor
{
public:
	void api_1{} {
		mutex.lock();
		// do something
		api_2{}
		mutex.unlock();
	}
	void api_2{} {
		mutex.lock();
		// do something
		mutex.unlock();
	}
	
private:
	mutex mutex;
}

解决方案一:使用分层锁设计,避免嵌套

class Motor {
public:
    void api_1() {
        std::lock_guard<std::mutex> lock(mutex);
        // do something that doesn't call api_2
    }
    
    void api_2() {
        std::lock_guard<std::mutex> lock(mutex);
        // do something
    }
    
private:
    std::mutex mutex;
};

解决方案二:重构设计,避免方法间互相调用受锁保护的操作

class Motor {
public:
    void api_1() {
        std::lock_guard<std::mutex> lock(mutex);
        // do something
        api_2_locked();  // 专门为已锁定情况设计的方法
    }
    
    void api_2() {
        std::lock_guard<std::mutex> lock(mutex);
        api_2_locked();
    }
    
private:
    void api_2_locked() {
        // 必须在持有锁的情况下调用
        // do something
    }
    
    std::mutex mutex;
};

解决方案三:使用递归锁(不推荐,除非确实需要)

注意:递归锁通常表明设计有问题,应尽量避免。

class Motor {
public:
    void api_1() {
        std::unique_lock<std::recursive_mutex> lock(mutex);
        // do something
        api_2(); // 现在可以安全调用
    }
    
    void api_2() {
        std::unique_lock<std::recursive_mutex> lock(mutex);
        // do something
    }
    
private:
    std::recursive_mutex mutex;
};

网站公告

今日签到

点亮在社区的每一天
去签到