Mutex不起作用

时间:2016-10-28 08:10:45

标签: c++ mutex

我的代码是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;
}

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的概念(资源获取是初始化)

简而言之:RAII:您在构造函数中执行操作并执行&#34;撤消&#34;析构函数中的操作。对于互斥锁,这将是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_guardshared_ptr)。一般而言,您应该更喜欢 RAII实现而不是手动方法,以获得更强大的代码并且更不容易出错。