使用信号量进行并发的线程二叉树

时间:2014-06-24 23:48:57

标签: c multithreading thread-safety binary-tree

我对多线程和同步非常不熟悉,我必须将信号量代码添加到给定的伪代码中,这将允许多个线程以最大并发性访问线程二进制树。

pesudocode给出了包含以下内容的节点结构:

int data
node *leftchild, *rightchild, *prev, *next;

并且唯一的函数是insert(node *root, int data),它搜索当前树中的父节点,然后插入新节点(假设它已经不在树中)并更改{{1 }和prev指针。

我不确定如何最好地实现信号量。我最初的想法是:

  • 锁定/解锁每个节点,因为它正在被搜索。这是为了防止在我搜索时插入其他线程。父节点是否也应该被锁定?

然后插入:

  • 锁定父节点和当前节点,以防止另一个线程同时插入同一位置。

还有更好的方法吗? (假设它首先是正确的)

1 个答案:

答案 0 :(得分:-1)

在这种情况下,您应该使用读写锁。如果您以后决定切换树实现并且需要更多工作,那么锁定单个节点或树的某些部分将变得异常困难。

int32_t Tree_insert(Tree *tree, int32_t data) {
    pthread_rwlock_wrlock(&tree->rwlock);
    int32_t ret = insert(&tree->root_node, data);
    pthread_rwlock_unlock(&tree->rwlock);
    return ret;
}