2013-04-12 36 views
0

假設我有一棵樹,並假設在樹的每個節點中都有一個條件變量。條件變量誤解

我們假設有5個節點試圖插入我的樹(已經有10個節點),並且出於某種原因,5無法插入(它們正在等待某些節點被刪除),所以我讓它們等待使用它們的條件變量。現在,在樹中發生刪除操作,我想檢查那些正在等待的刪除操作,然後我想發信號通知一個節點,我怎麼知道哪個線程發信號,我是否必須跟蹤所有條件變量最初在插入?

假設在一定的缺失,我想信號線3,正在等待(含2人一起),我怎麼能具體地說是信號線3',將線程3還記得他試圖插入?

在我刪除功能,當我信號,我不知道該線程等待條件變量是什麼,因爲每個節點都有一個條件變量,並且可以有每一個條件變量等待多個節點。我知道一個廣播都會聯繫所有的線程,但是我怎樣才能做到這一點,並且特別指出一個線程最初想要在樹中插入一個值5,但是因爲一個線程已經存在了,所以它不可能知道這5已被刪除,它應該插入5,但與5等待一起,有1,6,3,2的等待,所以我有5個條件變量,不知道哪一個是5

這是所有使用linux的C語言。

+1

我不太明白你想要做什麼,但你幾乎肯定不希望在樹中的每個節點的單獨的條件變量。 – NPE

+0

@NPE我怎麼才能知道只有一個條件變量的每個線程的上下文? – Ozymandy

+0

@NPE讓我換句話說,假設我有一棵已經有節點2,3,4的樹,假設我想插入2和3,但是因爲它們已經存在,所以我等不及了。當刪除3時,我希望該線程被通知3已被刪除,然後插入。當刪除2時,我希望該線程得到通知,因此它可以插入2.當刪除4時,什麼都不應該發生。 – Ozymandy

回答

1

一般來說,你的條件變量,它是用來等待的事情聯繫起來。因此,如果線程3正在等待節點X被刪除,它可能會等待節點X的條件變量上的信號。線程3不會等待它所插入節點的條件變量上的信號。如果線程5刪除了節點X,那麼它就會在節點X的條件變量上發出信號。線程5不需要知道線程3正在等待;它只是表示節點X的條件變量,pthreads管理通知正在等待該條件變量的線程的工作。

我有些擔心,要刪除節點,並與他們一起可能會被刪除的條件變量。如果您要刪除節點X,則不會刪除其條件變量,直到等待它的線程被喚醒,並且條件變量不再使用。所以你的設計在那裏不清楚。

+0

那麼設計這個的明確方法是什麼?我被告知我可以使用1個條件變量,但我不知道如何工作。我正在考慮廣播全部,但即使該線程被喚醒,它將如何重新插入? – Ozymandy