c++ - vector 的lock_guards

标签 c++ multithreading c++11

我正在使用一些多线程代码(使用并发数据结构),其中一部分要求我锁定一组互斥体。对于我的实现,我使用了 lock_guards vector ,因为我不一定知道需要锁定多少个互斥体,并且我可能会遇到异常情况,这将迫使我解锁所有互斥体并重新启动。这就是 vector 的原因。

我尝试使用的代码归结为:

#include <mutex>
#include <vector>


using namespace std;

int main( int argc, char** argv ) {
    vector<recursive_mutex> vec(10);

    vector<lock_guard<recursive_mutex>> lgv;
    for( auto it = vec.begin(); it != vec.end(); ++it ) {
        lgv.emplace_back( *it );
    }

    return 0;
}

当我尝试编译这个(G++ 5.3.1 使用 --std=c++11)时,我收到以下错误(有些精炼):

In file included from foo.cpp:1:0:
/usr/include/c++/5.3.1/mutex:385:7: note: declared here
   lock_guard(const lock_guard&) = delete;

根据我对 emplace_back 的理解,库不应该尝试使用 lock_guard 的复制构造函数——它应该执行就地构造。我是否理解应该正确发生什么,或者我的理解有缺陷吗?

仅供引用,我尝试使用 unique_lock 并且编译得很好。但是,我对这种(明显的)差异很好奇。

最佳答案

我认为,这个问题反射(reflect)了使用 unique_lock 的尝试,OP 说这是有效的。使用 lock_guard 的相同示例将不起作用,因为 std::vector::emplace_back 要求类型同时为 MoveInsertableEmplaceConstructible,并且 std::lock_guard 不适合。

关于c++ - vector 的lock_guards,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34621090/

相关文章:

c++ - std::addressof - 奇怪的实现

类实例的 C# 线程安全

java - Groovy 脚本防止删除文件 - 如何遵守它?

c++ - 是否可以在模板中快速使用二进制逻辑?

C++11 可重入类锁定策略

c++ - 使用 Doxygen 注释不同文件中的函数

c++ - "if"和 "else if"命令在 c++ 中不起作用

c++ - 如何解包类型定义的类型?

c++ - 可以将测试用例存储在相应的类中吗? (C++)

multithreading - 将 log4net 用于多线程应用程序