2012-10-13 33 views
0

我想用pthread庫創建線程。彙編沒問題, gcc -o -pthread file file.c運行時錯誤 - POSIX線程

但是當我運行代碼時,出現了段錯誤。我不確定問題是什麼。我試圖執行教科書中給出的代碼來嘗試學習,但現在我迷失了方向。誰能幫忙?代碼如下...非常基本,是的,但請把我趕出去。

#include<stdio.h> 
#include<pthread.h> 

int sum; 
void *runner(void *param); 

int main (int argc, char *argv[]) 
{ 
    pthread_t tid; 
    pthread_attr_t attr; 
    //printf("Am I here..?\n"); 
    if (argc!=2) 
    { 
     fprintf(stderr, "usage: a.out ...\n"); 
     return -1; 
    } 

    if (atoi(argv[1] < 0)) 
    { 
     fprintf(stderr, "%d must be >= 0\n", atoi(argv[1])); 
     return -1; 
    } 



    pthread_attr_init(&attr); 
    pthread_create(&tid, &attr, runner, argv[1]); 
    pthread_join(tid, NULL); 

    printf("sum = %d\n", sum); 
} 

void *runner(void *param) 
{ 
    extern int sum; 
    int i, upper=atoi(param); 
    sum=0; 

    for(i=1; i<= upper; i++) 
     sum+=i; 

    pthread_exit(0); 
} 
+0

這可能是值得學習如何使用調試器。在linux上''gdb'將是選擇的工具。在使用'gdb'後,你會在短時間內很輕鬆地發現這個錯誤。 – alk

+0

此外,使用選項'-Wall'打開所有警告是一個好主意。在您的特定情況下,編譯器將打印的警告將直接指向您的關鍵代碼行。試試吧.. ;-) – alk

回答

1

您弄丟了支架:

變化:

if (atoi(argv[1] < 0)) 

到:

if (atoi(argv[1]) < 0) 
+0

非常感謝!我覺得這是非常愚蠢的......調試器能幫助我識別所有這樣的小事情嗎? – plaknas

+0

是的,他們可以幫助您確定哪些線路會給您段錯誤:) –

3

請打開,並仔細檢查,你的編譯器的警告。

你不包括stdlib.h,所以atoi是未申報的,和你不return荷蘭國際集團從runner什麼,但你已經宣佈它爲返回void*

但主要問題是這一行:

if (atoi(argv[1] < 0)) 

argv[1] < 0將評估爲01,這是不是你想要作爲參數傳遞給atoi什麼。你想要的是:

if (atoi(argv[1]) < 0) 

如果啓用了正確的警告,你的編譯器很可能會指出所有這些問題。