簡體   English   中英

在一定時間后強行終止方法

[英]Forcibly terminate method after a certain amount of time

假設我有一個原型如下所示的函數,屬於類container_class

std::vector<int> container_class::func(int param);

該函數可能會或可能不會在某些輸入上產生無限循環; 無法確定哪些輸入會導致成功,哪些輸入會導致無限循環。 該函數在一個庫中,我沒有源代碼,也無法修改(這是一個bug,將在幾個月內在下一個版本中修復,但是現在我需要一種方法來解決它),所以修改函數或類的解決方案將不起作用。

我嘗試使用std::asyncstd::future隔離函數,並使用while循環不斷檢查線程的狀態:

container_class c();

long start = get_current_time(); //get the current time in ms
auto future = std::async(&container_class::func, &c, 2);

while(future.wait_for(0ms) != std::future_status::ready) {
    if(get_current_time() - start > 1000) {
        //forcibly terminate future
    }

    sleep(2);
}

這段代碼有很多問題。 一個是我不能強行終止std::future對象(以及它所代表的線程)。

在極端情況下,如果我找不到任何其他解決方案,我可以在自己的可執行文件中隔離該函數,運行它,然后檢查其狀態並適當地終止它。 但是,我寧願不這樣做。

我怎么能做到這一點? 有沒有比我現在做的更好的方式?

對不起,你運氣不好。

首先,C ++甚至不保證會有一個線程供將來執行。 雖然在單個線程中實現所有std::async保證是非常困難的(可能是不可能的),但是沒有直接禁止這一點,而且,當然不能保證每個async調用都會有一個線程。 因此,無法取消異步執行。

其次,即使在最低級別的線程實現中也沒有這種方式。 例如,當pthread_cancel存在時,它不會保護您免受無限循環訪問取消點的影響。

你不能在Posix中任意殺死一個線程,而C ++線程模型就是以它為基礎的。 一個進程實際上不能成為它自己的線程的調度程序,雖然有時它是一個痛苦,它就是它的本質。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM