【问题标题】:Condition variable misconception条件变量误解
【发布时间】:2013-04-05 07:17:11
【问题描述】:

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

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

假设在某个删除时,我想向线程 3 发出信号,它正在等待(以及其他 2 个),我该如何具体地向线程 3 发出信号?,线程 3 是否还记得他试图插入的内容?

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

这都是用 C 语言,使用 linux。

【问题讨论】:

  • 我不太了解您要执行的操作,但您几乎可以肯定不希望树中的每个节点都有单独的条件变量。
  • @NPE 如何仅用一个条件变量知道每个线程的上下文?
  • @NPE 让我换个说法,假设我有一棵树,它已经有节点 2、3、4,假设我想插入 2 和 3,但我不能,因为它们已经存在,我等着。当 3 被删除时,我希望通知该线程 3 已被删除,继续插入。删除 2 时,我希望通知该线程,以便它可以插入 2。删除 4 时,什么都不会发生。
  • 您为什么要等待添加树中第一个位置的内容?放置一个节点计数器,当添加两次节点时增加它,当计数器达到0时真正删除节点?
  • @LtWorf,理解 pthread 等待和信号是我的任务。请阅读我的问题并尝试回答。我特别想使用信号和等待

标签: c multithreading variables pthreads conditional-statements


【解决方案1】:

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

我有点担心您正在删除节点,并且可能会连同它们一起删除条件变量。如果您要删除节点 X,则在等待它的线程被唤醒并且不再使用该条件变量之前,您不希望删除它的条件变量。所以你的设计在那里不清楚。

【讨论】:

  • 那么有什么清晰的设计方法。有人告诉我我可以使用 1 个条件变量,但我不知道它是如何工作的。我本来想全部广播,但是即使那个线程被唤醒了,它怎么会重新插入呢?
猜你喜欢
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2011-09-13
相关资源
最近更新 更多