2010-05-10 44 views
4

我正在使用boost :: thread來處理隊列中的消息。 當第一條消息到來時,我啓動一個消息處理線程。 當第二條消息到來時,我檢查消息處理線程是否完成。我如何知道升壓線程是否完成?

如果這樣做我開始一個新的 如果沒有完成我什麼也沒做。

如何知道線程是否完成?我試着用joinable(),但它不工作,因爲當線程完成時,它仍然可以連接。

我也嘗試立即中斷這個過程,並在我的線程末尾添加一箇中斷點,但它不起作用。

感謝

編輯:

我想有我線程睡一個不確定的時間,醒來時,信號被觸發。

平均要做到這一點是提高:: condition_variable

回答

1

爲每個傳入消息產生一個新線程的效率非常低。你應該看看Thread pool pattern

編輯:

對不起,jules,我誤解了你的問題。我建議你看看producer-consumer模式。看看這個article關於如何使用boost條件變量推出自己的阻塞隊列。英特爾的Thread Building Blocks也有阻塞隊列的實現。

查看關於現有無鎖隊列實現的SO question

希望這會有所幫助。

+0

我的想法是隻有一個處理線程。當它完成處理時,我希望它能夠睡眠,並且一旦有新消息到來就能夠喚醒它。你知道如何做到這一點與提升? – Arthur 2010-05-11 06:36:17

+0

你會想要一個生產者 - 消費者隊列。看到我上面的附錄。 – 2010-05-11 14:25:48

+0

我很瞭解生產者 - 消費者模式。我需要的是一種喚醒事件上線程的方法(當緩衝區不再空時)。我不知道有什麼辦法做到這一點。 – Arthur 2010-05-12 14:46:30

0

您是否嘗試過檢查get_id()與升壓:: this_thread :: get_id()。如果它們匹配的線程不存在。但是這隻會在你退出線程時纔會發生。

+0

即使線程完成,線程ID也總是不同。 如何退出線程? – Arthur 2010-05-10 09:45:42

+0

通過退出線程我只是表示它應該到線程停止並返回的點。但我想joinable()可以做同樣的事情。 – jpyllman 2010-05-10 09:53:59

2

就我所知,應該使用join()方法來等待線程執行的結束。您可以在timed_join()超時時使用它。

你可以用interrupt()中斷線程。在這種情況下,在線程內部,如果執行到達中斷點(boost :: this_thread :: sleep()或boost :: this_thread :: interruption_point()),將發生異常。你可以捕獲線程內的異常,然後關閉它。

相關問題