簡體   English   中英

多線程程序中的stackoverflow

[英]stackoverflow in multithreaded program

我正面臨設計問題。 函數1和2相互調用數百次,遞歸不是無限的。 在運行程序時,它滿足溢出條件。設置openmp stacksize也不起作用。

#pragma omp parallel 
{
    //some variable private to each thread
    //some processing
    //call function1( array )


}

function1( array ){
     //some variable
    //some processing
    //call function2( array )
    //return


}

function2( array ){
      //some variable
     //some processing
    //if condition fail return
    //else call function1()
    //return

}

如果確實調用另一個函數是每個函數中的最后一件事,則可以手動將function2內聯到function1並將遞歸轉換為循環:

function1(array) {
    while(1) {
        // some variables (from function 1)
        // some processing (from function 1)
        // some variables (from function 2)
        // some processing (from function 2)
        if condition fail break;
        // loop back 'calling' function 1 again
    }
}

它可能會通過移動的定義,以達到同樣的效果function2之前function1和內聯宣布它-編譯器的優化器則能夠內聯函數,把尾遞歸調用到分支機構。

如果您的函數比您所描述的要復雜(而不是尾部遞歸),那么這將無法簡單地工作,盡管您可以稍微改變一下內容使其尾部遞歸。

最好的選擇是只有一個功能。
在您的評論中,您說: «不可能,因為函數彼此調用»

但這正是為什么堆棧會溢出的原因,因此可以認為這是錯誤的設計...

據我所知,您不需要單獨的功能。
您可以輕松解決問題,例如:

#pragma omp parallel 
{
    // Some variables private to each thread
    // Some processing
    // call function1( array )
}

function1( array )
{
    start:
    {
        // Some variables
        // Some processing
    }

    {
        // Some variables
        // Some processing
        // if condition fail return
        // else goto start
    }
}

我知道很多人說goto語句是錯誤的設計選擇,但是在您的情況下,我認為情況並非如此……這只會節省您的堆棧空間。

無論如何,它仍然比不起作用的代碼要好。

暫無
暫無

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

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