2012-04-22 58 views
0

我無法在c中執行pthreads程序。請告訴我以下程序有什麼問題。我既沒有收到任何錯誤,也沒有預期輸出。以下pthread程序有什麼問題?

void *worker(void * arg) 
{ 
    int i; 
    int *id=(int *)arg; 
    printf("Thread %d starts\n", *id); 
} 

void main(int argc, char **argv) 
{ 
    int thrd_no,i,*thrd_id,rank=0; 
    void *exit_status; 
    pthread_t *threads; 

    thrd_no=atoi(argv[1]-1); 

    thrd_id= malloc(sizeof(int)*(thrd_no)); 
    threads=malloc(sizeof(pthread_t)*(thrd_no)); 

    for(i=0;i<thrd_no;i++) 
    { 
    rank=i+1; 
    thrd_id[i]=pthread_create(&threads[i], NULL, worker, &rank); 
    } 

    for(i=0;i<thrd_no;i++) 
    { 
    pthread_join(threads[i], &exit_status); 
    } 
} 
+2

呃,其中一個,你的程序會建立儘可能多的警告,因爲它有行。考慮添加一些包含並整理警告;編譯器很擅長告訴你有關令人討厭的驚喜,你應該注意它的警告。 – zmccord 2012-04-22 07:15:02

回答

1

thrd_no = atoi(argv[1] - 1);可能不會做你想要的; argv通常被傳遞到一個新的進程並解析成一個C數組,argv[1] - 1可能指向\0(具體地說,\0argv[0]的末尾)。 (更一般地說,從字符串的開頭向後索引很少正確)。結果是atoi()將返回0,並且不會創建線程。你打算在那裏做什麼?

+0

我想創建no。的線程等於一個小於一個。由用戶輸入。 – Aps 2012-04-22 07:27:08

+0

這將是'atoi(argv [1]) - 1'。同樣考慮到如果用戶傳遞非數字或'0'會發生什麼,但是,由於缺少錯誤檢查。 – geekosaur 2012-04-22 07:28:09

0

您正在向每個線程傳遞相同的地址&rank,所以id*id對於您所有的worker-s都是相同的。

您應該更好地在堆上分配您傳遞給每個工作程序的地址。

您可能還包括<stdint.h和使用intptr_t,例如,

void worker (void* p) 
{ 
    intptr_t rk = (intptr_t) p; 
    /// etc 
} 

,並呼籲

intptr_t rank = i + 1; 
thrd_id[i]=pthread_create(&threads[i], NULL, worker, (void*)rank); 

你應該學會使用調試器編譯所有警告和調試信息,即gcc -Wall -g(和改善你的代碼,直到它得到任何警告,然後使用gdb

0

代碼段rank = i + 1; thrd_id [i] = pthread_create(& threads [i],NULL,worker,& rank);

會產生競爭狀態。