2016-10-28 146 views
0

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

你的函数中有多个返回语句,你不解锁你的互斥锁。 lock_guard会自动为您执行此操作。如果你不使用它,你必须在每次返回之前解锁互斥锁 – Hayt

+0

谢谢,它工作正常 –

回答

3

一个std::lock_guard使用一个被称为RAII概念(资源采集是初始化)

RAII总之:你在构造函数中的作用,并在析构函数做了“撤销”操作。对于互斥体,这将是unlock

因此,随着lock_guard无论何时return(超出范围),互斥锁将自动解锁。

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

这就是RAII类存在的原因。所以你不必担心这一点。无论何时您更改功能并添加另一个return,您都可以忘记添加unlock。与lock_guard你不必考虑它。

还有其他选择。几个SCOPE_EXIT makros在它离开示波器的那一刻执行语句(有关更多信息,请参阅BOOST或我最喜欢的folly/ScopeGuard)。尽管如果您还没有RAII课程(如lock_guard),它们会更有用。

在现代C++中还有其他几个例子(例如shared_ptrunique_ptr)。一般而言,您应该使用更优于的RAII实现,而不是使用手动方法来获得更健壮的代码并且更少出错。