[英]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.