C++代码中的条件变量和互斥锁问题解析

引子:解决C++代码中的条件变量和互斥锁问题

在编写C++代码时,经常需要使用条件变量(std::condition_variable)和互斥锁(std::mutex)来实现多线程同步。然而,这两者在使用时需要谨慎,特别是在容器中存储它们时可能会遇到一些问题。在本文中,我们将探讨一个实际代码示例,以解决关于条件变量和互斥锁的问题。

正文:分析给定的C++代码

给定的C++代码中,有一个名为MyClass的类,它接受一个整数参数num_conds并在构造函数中初始化两个私有容器:conds_mutexes_。其中,conds_std::vector<std::condition_variable>类型,而mutexes_std::vector<std::mutex>类型。

在构造函数中,使用以下方式初始化这两个容器:

MyClass(int num_conds) : conds_(num_conds), mutexes_(num_conds) {
}

这段代码的目标是在类初始化时根据传入的参数num_conds设置条件变量容器conds_和互斥锁容器mutexes_的大小,并向其中添加对应数量的元素。

问题一:条件变量不支持拷贝复制

问题在于,C++的条件变量std::condition_variable不支持拷贝构造。而在上述代码中,使用的是填充构造函数,它会创建指定数量的默认初始化的元素。这并没有涉及到拷贝或移动操作,因此没有触发条件变量不支持拷贝的问题。

问题二:动态添加元素

在代码中,虽然你可以在构造函数中设置容器的大小,但是如果以后需要动态添加更多的条件变量或互斥锁,使用push_backemplace_back等方法可能会遇到问题。

  • push_backemplace_back函数会触发拷贝或移动操作,而条件变量不支持拷贝构造,因此会导致编译错误。

  • 如果你需要在运行时动态添加条件变量或互斥锁,可以考虑使用std::vector<std::unique_ptr<std::condition_variable>>这样的结构,其中std::unique_ptr支持移动语义,可以避免拷贝问题。

解决方案

要解决这个问题,你可以在构造函数中设置容器的大小,这是一个有效的方法,但需要注意不要尝试拷贝条件变量。如果将来需要在运行时动态添加更多的条件变量或互斥锁,可以考虑使用std::vector<std::unique_ptr<std::condition_variable>>这样的结构。

结论:正确使用条件变量和互斥锁

在编写多线程C++代码时,正确使用条件变量和互斥锁是非常重要的。了解它们的工作原理以及如何在容器中使用它们是解决问题的关键。在构造函数中设置容器大小是一个可行的方法,但要注意条件变量不支持拷贝构造,因此需要小心处理动态添加元素的情况。

声明:本站所有文章,如无特殊说明或标注,均为本站(王大神)原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
指数词

购买 14 寸 MBP:明智的选择吗?

2023-10-12 23:26:41

指数词

如何在2023年使用Docker在群晖上部署应用

2023-10-12 23:38:16

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索