假设我有一棵树,并且在树的每个节点中都有一个条件变量。
假设有5个节点试图插入到我的树中(已经有10个节点),并且由于某种原因,这5个节点无法插入(它们正在等待某些节点被删除),所以我使用它们的条件变量让它们等待。既然树中正在发生删除,我想检查正在等待的删除是否在等待删除,因此我想发信号通知节点,我如何知道要发信号的线程,我是否必须跟踪所有线程插入中最初的条件变量?
假设有某种删除,我想发信号通知正在等待的线程3(以及其他2个线程),我该如何具体发信号通知线程3?线程3是否仍记得他试图插入的内容?
在删除函数中,当我发出信号时,我不知道该线程等待的条件变量是什么,因为每个节点都有一个条件变量,并且可能有多个节点,每个节点都有一个条件变量等待。我知道广播会联系所有线程,但是如果没有广播,我该怎么做,特别是发信号通知线程最初想在树中插入值5,但由于已经存在5,所以它不能知道那5已被删除,它应该插入5,但是随着5等待,还有1,6,3,2等待,所以我有5个条件变量,不知道哪个是5。
使用linux,一切都在C中。
最佳答案
通常,您将条件变量与用于等待的事物相关联。因此,如果线程3正在等待删除节点X,则它可能正在等待节点X的条件变量上的信号。线程3将不会等待它正在插入的节点的条件变量上的信号。如果线程5删除了节点X,那么它将在节点X的条件变量上发出信号。它只是在节点X的条件变量上发出信号,而pthreads管理通知正在等待该条件变量的线程的工作。
我有点担心您正在删除节点,并且可能会同时删除条件变量。如果要删除节点X,则不希望删除其条件变量,直到唤醒等待它的线程并且不再使用条件变量为止。因此,您的设计在那里还不清楚。
关于c - 条件变量误解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15976828/