2012-05-29 28 views
-1

程序應該從命令行獲取參數,並通過posix線程添加參數。但Xcode成功構建它,但沒有輸出。這段代碼有什麼問題嗎? 謝謝XCode上的POSIX線程添加

#include <iostream> 
#include <pthread.h> 

using namespace std; 

void *Add(void *threadid){ 
    long tid; 
    tid =(long)threadid; 
    long sum=0; 
    sum=sum+tid; 
    printf("%ld.\n",sum); 
    pthread_exit(NULL); 
}  

void *Print(void *threadid){ 
    long tid; 
    tid =(long)threadid; 

    printf("%ld.\n",tid); 
    pthread_exit(NULL); 
} 

int main (int argc, char const *argv[]) 
{ 
    if(argc<6){ 
    printf("you need more arguments"); 
    return -1; 
    } 

    long real[5]; 
    pthread_t athread,bthread; 

    for (int x=1;x<=5;x++) 
    real[x-1]=atol(argv[x]); 

    for(int y=1;y<=5;y++) 
    pthread_create(athread[y],NULL,Add,(void *)&real[y]); 

    for(int y=1;y<=5;y++) 
    pthread_create(bthread[y],NULL,Print,(void *)&real[y]); 

    pthread_exit(NULL); 
    return 0; 
} 
+1

這個問題是無法解讀的。 「在posix中添加參數」? 「Xcode不提供輸出,地址」輸出/地址是什麼?什麼是'dbll'?至於代碼,顯然,即使是第一件事情就是讓代碼運行。 '#include iostream'甚至不包括所需的括號或引號。 – bames53

+0

對不起,發帖時我忘了括號。他們在真實的代碼 – user1424263

+0

好吧,這很好,但這是問題最少的問題。你可以編輯你的問題來改善它。如果你更清楚你要問什麼,那麼你會更有可能得到有用的答案。 – bames53

回答

1

首先,我認爲你應該檢查pthread_create方法是否成功。 我沒有在蘋果下的pthread中的expirience,但基於這個代碼,我認爲你有線程創建的問題。

+0

+1 - 不要忽略錯誤檢查! –

+0

是的,你的代碼仍然是barf,athread和bthread不是數組。確保你的Xcode控制檯打開,然後打開你的調試器。 – jiveturkey

1

首先,printfstdio.h中定義,而不是在iostream中定義。如果你想這樣做,應使用iostream的C++方式,然後使用cout << "Blabla " << var << endl;

其次,你打電話pthread_create有錯誤的參數。如定義athreadbthread不是數組,但您可以使用它們。我不完全確定爲什麼這甚至會編譯,因爲pthread_create預計pthread_t*作爲第一個參數,並且您提供*pthread_t。如果代碼編譯完成,它很可能會在運行時崩潰。

三,你沒有加入加法器線程。這意味着您的打印線程可能在加法器線程完成之前開始。

四,你正在彙總到局部變量。你應該總結成一個全球性的。不要忘記通過互斥或其他方式來保護它的訪問。

第五,線程例程的參數是錯誤的。您將指針傳遞給該值,而不是該值本身,之後將指針重新解釋爲值本身。你很可能會想要使用(void *)real[y]而不是(void *)&real[y]。請注意,鑄造longvoid *不適用於所有系統。在Mac OS X上,longvoid *的長度都相同(32位或64位),但通常情況並非如此。

編輯:您的代碼甚至不編譯在OS X:

$ g++ -o t.x t.cpp 
t.cpp: In function ‘int main(int, const char**)’: 
t.cpp:37: error: cannot convert ‘_opaque_pthread_t’ to ‘_opaque_pthread_t**’ for argument ‘1’ to ‘int pthread_create(_opaque_pthread_t**, const pthread_attr_t*, void* (*)(void*), void*)’ 
t.cpp:40: error: cannot convert ‘_opaque_pthread_t’ to ‘_opaque_pthread_t**’ for argument ‘1’ to ‘int pthread_create(_opaque_pthread_t**, const pthread_attr_t*, void* (*)(void*), void*)’ 

$ clang -o t.x t.cpp 
t.cpp:37:5: error: no matching function for call to 'pthread_create' 
    pthread_create(athread[y],NULL,Add,(void *)&real[y]); 
    ^~~~~~~~~~~~~~ 
/usr/include/pthread.h:304:11: note: candidate function not viable: no known 
     conversion from 'struct _opaque_pthread_t' to 'pthread_t *' (aka 
     '_opaque_pthread_t **') for 1st argument; 
int  pthread_create(pthread_t * __restrict, 
     ^
t.cpp:40:5: error: no matching function for call to 'pthread_create' 
    pthread_create(bthread[y],NULL,Print,(void *)&real[y]); 
    ^~~~~~~~~~~~~~ 
/usr/include/pthread.h:304:11: note: candidate function not viable: no known 
     conversion from 'struct _opaque_pthread_t' to 'pthread_t *' (aka 
     '_opaque_pthread_t **') for 1st argument; 
int  pthread_create(pthread_t * __restrict, 
     ^
2 errors generated. 

不要你甚至看到,Xcode是提供錯誤信息?

+0

不僅可以在添加線程之前開始打印線程(我不能確定這是一個真正的問題,因爲我不知道程序應該做什麼),但是程序可以在打印線程啓動之前退出,從而導致不打印任何東西的可能性。 – bames53

+0

那麼,進程不應該退出,直到它的所有線程都完成了,但是線程例程的參數位於主線程的堆棧中,並且如果(或者當它)跳出'main ()'。 –

+0

這取決於線程庫/語言。例如,在main函數返回之後,Java進程會繼續,直到所有用戶線程都完成。但是,在pthreads,std :: threads等中,進程在主函數返回後退出,並且任何其他正在運行的線程都被簡單終止。 – bames53