【问题标题】:Threaded Binary Tree using semaphores for concurrency使用信号量进行并发的线程二叉树
【发布时间】:2014-08-15 09:25:59
【问题描述】:

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

伪代码给出的节点结构包含:

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

唯一的函数是insert(node *root, int data),它在当前树中搜索找到父节点,然后插入新节点(假设它不在树中)并更改prevnext指针。

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

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

然后进行插入:

  • 锁定父节点和当前节点,可以防止另一个线程同时插入到同一个地方。

有没有更好的方法来解决这个问题? (假设它首先是正确的)

【问题讨论】:

  • 不知道锁定树中的单个节点是什么意思。您在整个树上获得一个锁,插入新值,然后释放锁。不过我不会使用信号量,而是使用互斥体。
  • 脑海中浮现出一堆问题:这棵树有多大?预计有多少插入与读取?搜索快还是写更重要?是否有任何高速、实时的限制,或者您可以批量写入吗?
  • 我在想的是,现实世界的“最大并发”通常不是通过处理器线程而是通过队列和“轻”线程来实现的。 NodeJS 的高性能就是一个例子。但是数据来自哪里(以及新数据到达的速度)是了解这是否会给您带来优势的关键。
  • @AndreaLaforgia 我必须使用信号量作为分配的一部分,并计划只使用二进制信号量来镜像互斥锁。
  • @SomeCallMeTim 使用给定的伪代码以及问题的措辞,我将其解释为包含整数 >= 0 且不重复的任意大小的树。唯一的功能是插入功能,所以插入才是最重要的——搜索只是为了抢占插入。

标签: c multithreading thread-safety binary-tree


【解决方案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;
}

【讨论】:

  • 感谢您的信息。这更像是一个假设场景,我应该使用信号量来允许多个线程同时访问树。我只是不确定我最初建议的是否正确。我知道可以(并且可能更有效)简单地锁定/解锁整个树以插入一个节点,但不幸的是它不是练习的重点
  • @Caulay 练习的要求是什么?
  • @AndreaLaforgia 我必须“在伪代码中使用信号量,以便多个线程可以共享对数据结构的访问。您的目标是最大化数据结构的并发使用”。
  • 锁定整个树 - 最大化并发性。
猜你喜欢
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多