我的代码是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;
}
答案 0 :(得分:3)
Sub getDS()
asname = "data"
bsname = "Anual"
csname = "Total"
filename = Sheets("data").Range("B64").Value
path = Sheets("data").Range("B63").Value
Dim ws As Worksheet
Set ws = Sheets("data")
With ws.Range("D4:D34")
.ClearContents
.Formula = "='" & path & "[" & filename & "]" & bsname & "'!R11"
.Value = .Value
End With
With ws.Range("J4:J34")
.ClearContents
.Formula = "='" & path & "[" & filename & "]" & bsname & "'!U11"
.Value = .Value
End With
With ws.Range("J37:J37")
.ClearContents
.Formula = "='" & path & "[" & filename & "]" & csname & "'!DW96"
.Value = .Value
End With
End Sub
使用一个名为RAII的概念(资源获取是初始化)
std::lock_guard
因此,只要您unlock
(超出范围)lock_guard
,互斥锁就会自动解锁。
当您将其更改为&#34;手册&#34; mutex你必须确保在函数的每个可能的退出点上执行return
(在每个unlock
之前)。
这就是RAII类存在的原因。所以你不必担心这个。每当您更改功能并添加另一个return
时,您都会忘记添加return
。使用unlock
,您不必考虑它。
还有其他选择。几个lock_guard
makros在离开作用域时执行语句(有关详细信息,请参阅SCOPE_EXIT
或我更喜欢的BOOST
)。虽然如果你还没有RAII课程(例如folly/ScopeGuard
),它们会更有用。
现代c ++中还有其他几个例子(例如lock_guard
和shared_ptr
)。一般而言,您应该更喜欢 RAII实现而不是手动方法,以获得更强大的代码并且更不容易出错。