gpt4 book ai didi

c++ - 互斥量不起作用

转载 作者:行者123 更新时间:2023-11-27 23:59:28 33 4
gpt4 key购买 nike

我的代码是一个 AVL 树,我正在尝试使用 mutex 进入。

mutex 不起作用。为什么?

返回黑屏,可能是死锁。我不知道。不存在递归函数。

如果我使用lock guard,它会正常工作。

template<typename T> int avl<T>::insere (int key , T data) {

mtx.lock();

no * nw = new no;

if (nw == NULL)
return 0;

nw->sire = NULL;
nw->left = NULL;
nw->right = NULL;
nw->key = key;
nw->data = data;

if (tree.root == NULL) {
tree.root = nw;
tree.quant++;
return 1;
}
no * son = tree.raiz;
no * sire = NULL;

while (son != NULL) {

sire = son;

if (key < son->key)
son = son->left;

else
son = son->right.;

}
nw->sire = sire;

if (key < sire->key)
sire->left = nw;

else
sire->right = nw;

tree.quantidade++;

no * current = nw;

while (current != NULL) {

int f = fator (nw);

if (f >= 2 || f <= 2)
balance( current);
current = current->sire;
}

mtx.unlock();

return 1;
}

最佳答案

std::lock_guard 使用一个称为 RAII 的概念(资源获取即初始化)

RAII 简而言之:您在构造函数中执行操作并在析构函数中执行“撤消”操作。对于 Mutex,这将是 unlock

因此使用 lock_guard 每当您 return(超出范围)时,互斥量将自动解锁。

当您将其更改为“手动”互斥锁时,您必须确保在函数的每个可能退出时执行unlock(在每个return 之前)。

这就是 RAII 类存在的原因。所以你不必担心这个。每当您更改函数并添加另一个 return 时,您可能会忘记添加 unlock。有了 lock_guard,您就不必再考虑了。

有替代方案。几个 SCOPE_EXIT makros 在语句离开范围时执行语句(有关更多信息,请参阅 BOOST 或我最喜欢的 folly/ScopeGuard) .如果您还没有 RAII 类(如 lock_guard),它们会更有用。

在现代 C++ 中还有几个其他示例(例如 shared_ptrunique_ptr)。一般来说,您应该更喜欢 RAII 实现而不是手动方法,以获得更健壮的代码和更不容易出错的方法。

关于c++ - 互斥量不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40300761/

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