我的代码如下。一个Element
包含一个指向mutex
的指针,并且有一个向量包含所有的Element
s。
如果我知道编译时元素的计数,我可以构造一个scoped_lock来锁定所有这些互斥锁。但是,我现在不知道向量的大小。那么,我怎样才能锁定所有的互斥锁并安全地生成锁保护呢?
#include <vector>
#include <mutex>
struct Element {
Element() {
mut = new std::mutex();
}
Element(Element && other) : mut(other.mut) {
other.mut = nullptr;
}
~Element() { delete mut; }
std::mutex * mut;
};
int main() {
std::vector<Element> v;
v.push_back(Element());
v.push_back(Element());
v.push_back(Element());
std::scoped_lock(*v[0].mut, *v[1].mut, *v[2].mut);
}
3条答案
按热度按时间omtl5h9j1#
你可以试试这个被诅咒的代码:
P.S.感谢@davis-herring的
std::unique_lock
建议。inn6fuwd2#
我真的没有看到任何用例,我们需要存储一堆互斥锁并在一行中锁定/解锁它们,但无论如何,您可以编写自己的“lock_guard”,通过迭代
std::vector
来锁定/解锁它们。**注意:**如果无法保持锁的顺序,则此解决方案会出现死锁问题。
示例
考虑下面的
Element
类(我只是以更简单的方式重写了它):你可以把你自己的“锁卫士”写为:
并按以下方式使用它:
1qczuiv03#
您可以按照自己选择的顺序锁定互斥锁,并按照相反的顺序解锁互斥锁。请注意,这并不能保证当
std::scoped_lock
与多个互斥锁一起使用时,锁定的顺序适合避免死锁。