2010-10-27 52 views
3

我正在尋找解決以下(C++)問題的最佳方法。我有一個框架給出的函數,它返回一個對象。有時只需要幾毫秒,但在某些情況下需要幾分鐘。所以我想停止執行,如果花費時間比說2秒鐘更長。 我正在考慮用boost線程來做這件事。重要的注意事項是,如果函數返回的速度快於2秒,程序不應該等待。 所以我想約2個線程:在n秒後kill線程

1.thread: execute function a  
2.thread: run timer     
if(thread 2 exited bevore thread 1) kill thread 1 
else do nothing 

我struggeling有點實際執行。特別是,

  • 我如何返回一個對象從一個孩子提升線程到主線程?
  • 我該如何殺死一個線程在提升?
  • 是我的想法,即使是一個很好的想法,有沒有更好的方法來解決在c + +的問題(有或沒有提升)?
+1

你不是真的想殺死線程;你想[禮貌打斷](http://www.drdobbs.com/architecture-and-design/207100682)。 – 2010-10-27 08:31:54

+0

出於好奇:你使用的框架是什麼,有時需要很長時間才能創建一個對象? – ereOn 2010-10-27 08:33:20

+0

我正在考慮一箇中斷,但是我看到的問題是我必須創建中斷點,而我不能修改我必須在線程中調用的框架函數。 – 2010-10-27 08:35:56

回答

2

至於等待,只需使用thread::timed_join()你的主線程內,這將返回false ,如果線程在給定的時間內沒有完成。

如果您的第三方庫不知道boost:threads,則殺死線程是不可行的。另外,你幾乎肯定不想在不給函數清理的情況下'殺死'線程。

我建議你等待2秒鐘,然後繼續處理某種錯誤信息,讓框架功能完成工作,如果結果太遲,忽略結果。

至於返回值,我建議像

struct myfunction { 
    MyObj returnValue; 
    void operator()() { 
    // ... 
    returnValue = theComputedReturnValue; 
    } 
}; 

// ... 
myfunction f; 
boost::thread t = boost::thread(boost::ref(f)); 
t.join(); // or t.timed_join()... 
use(f.returnValue); 
// ... 
+0

謝謝你看起來像它的作品。在帖子中只有一種類型,它應該是第3行中的operator()()。 – 2010-10-28 09:24:39

+0

謝謝,我解決了它... – MartinStettner 2010-10-28 14:58:55

0

我已經做了類似的過去和那些作品(即使不理想)。 爲了得到返回值只是「分享」一個變量(可能只是一個指針(最初爲零)到返回值,或一個完整的對象與狀態等),並讓你的線程讀取/更新它。不要忘記它需要互斥。這應該是非常直截了當的。

0

擴展詹姆斯上面所說的「殺死一個線程」是一個如此苛刻的術語! :)但是,中斷並不是那麼容易,通常在升壓線程的情況下,需要有一箇中斷點,在這個中斷點,運行的線程可以被中斷。有一組這些可中斷的函數(不幸的是它們是特定於boost的),例如等待/睡眠等。您擁有的一個選項是在第一個線程中,自由分散interrupt_points()。這樣,當線程2死亡時調用interrupt()時,在下一個interrupt_point()線程1處將拋出異常。

線程處於相同的進程空間,因此,只要存在對該共享狀態的同步訪問,就可以在多個線程之間共享狀態。

編輯:剛纔注意到,OP已經研究過這...將離開回答上來反正我猜...

+0

這個問題,正如已經在obove評論中所描述的那樣,我不能放置中斷點,我的線程函數只看起來像這樣:threadfunc(){myobject = someframework.callfucntion()} – 2010-10-27 08:46:10

+0

在這種情況下,我認爲你被卡住了,我只能想到另一種方式 - fork()並將第一個線程作爲一個單獨的進程運行,然後殺死它?共享狀態雖然會變得混亂,但我想你可以用共享內存解決這個問題嗎? – Nim 2010-10-27 08:58:38