条件变量误解

时间:2013-04-12 16:50:26

标签: c multithreading variables pthreads conditional-statements

假设我有一棵树,并假设我在树的每个节点都有一个条件变量。

假设5个节点试图插入我的树(已经有10个节点),并且由于某种原因,5无法插入(它们正在等待删除某些节点),所以我让它们等待使用他们的条件变量。既然在树中发生了删除,我想检查等待的是否在等待删除,那么我想要发信号通知一个节点,我怎么知道哪个线程要发出信号,我是否必须跟踪所有最初在插入中的条件变量?

假设某个删除,我想发信号3正在等待(和另外2个人一样),我怎么能特意发信号3?,线程3还记得他试图插入的内容吗?

在我的删除函数中,当我发出信号时,我不知道该线程等待的条件变量是什么,因为每个节点都有一个条件变量,并且可以有多个节点,每个节点都有一个条件变量等待。我知道广播都将联系所有线程,但是如果没有它,我怎么能这样做,特别是发信号通知线程最初想在树中插入值5,但是因为已经存在5,所以它不能,并且知道那5个已被删除,它应该插入5,但是随着5等待,有1,6,3,2等待,所以我有5个条件变量,并且不知道哪个是5。

这一切都在C中,使用linux。

1 个答案:

答案 0 :(得分:1)

通常,您将条件变量与用于等待的事物相关联。因此,如果线程3正在等待节点X被删除,它可能会等待节点X的条件变量上的信号。线程3不会等待它正在插入的节点的条件变量上的信号。如果线程5删除节点X,那么它将在节点X的条件变量上发出信号。线程5不需要知道线程3正在等待;它只是在节点X的条件变量上发出信号,而pthreads管理通知正在等待该条件变量的线程的工作。

我有点担心您正在删除节点,并且可能正在删除条件变量。如果要删除节点X,则不希望删除其条件变量,直到等待它的线程被唤醒,并且条件变量不再使用。所以你的设计还不清楚。