【发布时间】:2014-08-15 09:25:59
【问题描述】:
我对多线程和同步非常不熟悉,我必须将信号量代码添加到给定的伪代码中,这将允许多个线程以最大并发访问线程二叉树。
伪代码给出的节点结构包含:
int data
node *leftchild, *rightchild, *prev, *next;
唯一的函数是insert(node *root, int data),它在当前树中搜索找到父节点,然后插入新节点(假设它不在树中)并更改prev和next指针。
我不确定如何最好地实现信号量。我最初的想法是:
- 在搜索每个节点时锁定/解锁它。这是为了防止在我搜索时插入其他线程。父节点是否也应该被锁定?
然后进行插入:
- 锁定父节点和当前节点,可以防止另一个线程同时插入到同一个地方。
有没有更好的方法来解决这个问题? (假设它首先是正确的)
【问题讨论】:
-
不知道锁定树中的单个节点是什么意思。您在整个树上获得一个锁,插入新值,然后释放锁。不过我不会使用信号量,而是使用互斥体。
-
脑海中浮现出一堆问题:这棵树有多大?预计有多少插入与读取?搜索快还是写更重要?是否有任何高速、实时的限制,或者您可以批量写入吗?
-
我在想的是,现实世界的“最大并发”通常不是通过处理器线程而是通过队列和“轻”线程来实现的。 NodeJS 的高性能就是一个例子。但是数据来自哪里(以及新数据到达的速度)是了解这是否会给您带来优势的关键。
-
@AndreaLaforgia 我必须使用信号量作为分配的一部分,并计划只使用二进制信号量来镜像互斥锁。
-
@SomeCallMeTim 使用给定的伪代码以及问题的措辞,我将其解释为包含整数 >= 0 且不重复的任意大小的树。唯一的功能是插入功能,所以插入才是最重要的——搜索只是为了抢占插入。
标签: c multithreading thread-safety binary-tree