2013-04-11 59 views
-2

我不明白爲什麼下面的僞代碼導致段錯誤。在pthread中初始化時發生段錯誤

使用pthreads來運行一個函數我運行到一個SEGFAULT初始化一個整數爲零。

my_threaded_function不在線程上下文或者如果我從主線程調用函數沒有問題。

僅在maze_init函數內初始化rc=0; bu時纔會出現SEGFAULT。

我已確認我沒有堆棧空間。但我想不出是什麼導致函數在pthread內部行爲不同(不涉及共享內存),根據gdb無法訪問地址&aa

爲什麼堆棧變量的地址不在堆棧上?

int maze_init(Maze*m, char* filename) 
{ 
    FILE *fp; 
    int aa, bb, rc; 
    aa = 0;    /// SEGFAULT HERE 
    ... 
    return 1; 
} 

void* my_threaded_function(void* arg) 
{ 
    Maze maze; 
    int rc; 
    rc = 0; 

    rc = maze_init(&maze,"test.txt"); 
    return rc; 
    pthread_exit((void*)1); 
} 

int main(int argc,char** argv){ 
    pthread_t t; 
    pthread_create(&t, NULL, my_threaded_function,(void*)0); 
    sleep(10); 
} 
  • 編輯(固定碼錯字到return rc
+0

在你的'thread'函數中,即'my_threaded_function',你爲什麼要返回'return rn;'和'rn'聲明在哪裏? – Ganesh

+1

「迷宮」有多大? –

+0

你是否遞歸調用'maze_init'? 「迷宮」的定義是什麼? –

回答

3

我已經證實,我的堆棧空間。但我想不出 是什麼原因造成的功能表現不同的並行線程

好一個默認輔助線程具有比「主」線程較小的紙疊裏面。您可以使用pthread_attr_setstacksize來設置尺寸。

TLPI說:

每個線程都有自己的堆棧的大小當線程創建 是固定的。在Linux/x86-32上,對於主線程以外的所有線程, ,每線程堆棧的默認大小爲2 MB。 主線程具有 堆棧增長

一個更大的空間,所以這是一個原因,通常被稱爲時它會工作,並從輔助線程調用時失敗。

+0

是這個固定它....更改大對象動態內存分配 – samirahmed

相關問題