2013-01-03 14 views
0

我正在創建線程並將其地址存儲在地圖中。 這些線程會持續運行並遍歷(比如說)mapA直到我執行線程中斷。如何在第二個線程從地圖中刪除值時恢復線程?

現在的問題:

我想刪除的地圖的值。 我想讓這個線程休眠,直到mapA中的值被刪除完成。一旦刪除完成,線程應該繼續工作。

Thread1 
{ 
    ...Code... 
    ...Code... 
    loop over mapA 
    ...Code... 
    ...Code... 
} 

Thread2 
{ 
    sleep(Thread1) 
    until 
    value in the mapA is deleted 
    Continue(Thread1) 
} 

在此先感謝!

+0

線程1必須睡眠,直到線程2完成其工作並被刪除?聽起來有點像我的信號量。 – Stefan

回答

2

使用條件變量是示意性地使用boost:

boost::mutex mutex; 
boost::condition_variable cond; 

Thread1 
{ 
    boost::scoped_lock lock(mutex); 

    .... 
    // Looping over map done 
    cond.notify_one(); 
} 

Thread2 
{ 
    boost::scoped_lock lock(mutex); 

    // wait for end of thread1 
    cond.wait(lock); 

    // when we get here we continue, and lock is protecting concurrency from thread1 again 
    ... 
} 

這將很好地工作,即使在情況下,你有多個生產/消費。

+0

真的足夠了嗎?對我來說,它聽起來像一個典型的信號量。 – Stefan

+0

這就足夠了,互斥是爲了排他性,技術上它是一種信號量。在真正的代碼中,你很少需要完整的重量級信號量,大多數時候你只需要互斥鎖和rwlocks(無論如何都是通過互斥鎖來實現的)。 – anydot

+0

感謝您解釋。 – Stefan

相關問題