gpt4 book ai didi

c++ - lock_guards 的 vector

转载 作者:行者123 更新时间:2023-11-30 03:45:39 25 4
gpt4 key购买 nike

我正在使用一些多线程代码(使用并发数据结构),其中一部分需要我锁定一组互斥锁。对于我的实现,我使用了一个 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;
}

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

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++ - lock_guards 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34621090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com