我正在使用一些多线程代码(使用并发数据结构),其中一部分要求我锁定一组互斥体。对于我的实现,我使用了 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
要求类型同时为 MoveInsertable
和 EmplaceConstructible
,并且 std::lock_guard
不适合。
关于c++ - vector 的lock_guards,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34621090/