2013-03-03 71 views
1

我沒有得到任何輸出,但我期待輸出以下線程1線程2是代碼..線程同步沒有得到預期的輸出

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

using namespace std; 

void* fun(void *arg) 
{ 
    char *msg; 
    msg = (char*)arg; 
    cout<<msg<<endl; 
} 

int main() 
{ 

    pthread_t t1,t2; 

    t1 = pthread_create(&t1,NULL,fun,(void*)"THREAD1"); 
    t2 = pthread_create(&t2,NULL,fun,(void*)"THREAD2"); 

    pthread_join(t1,NULL); 
    pthread_join(t2,NULL); 
    // sleep (2); 
    return 0; 
} 

我改變了上面的代碼

pthread_create(&t1,NULL,fun,(void*)"THREAD1"); 
    pthread_create(&t2,NULL,fun,(void*)"THREAD2"); 

現在我越來越THREAD2 THREAD1但我需要THREAD1 THREAD2

現在我改變了我的代碼>

pthread_create(&t1,NULL,fun,(void*)"THREAD1"); 
pthread_join(t1,NULL);  

pthread_create(&t2,NULL,fun,(void*)"THREAD2"); 
pthread_join(t2,NULL); 

現在我的結果是正確的線程1線程2

回答

3
t1 = pthread_create(&t1,NULL,fun,(void*)"THREAD1"); 

這不是很好。 pthread_create返回整數返回碼,而不是pthread_t。您會覆蓋t1t2以及不應該存在的內容,並且後續的pthread_join調用很可能會崩潰或產生其他不可預測的結果。

int rc1 = pthread_create(...); 
if (rc1 != 0) { 
    // handle error 
} 

而且fun需要返回東西的方式你定義它。或者將其返回類型更改爲void。

+0

我已糾正它,但現在我得到THREAD2,然後THREAD1 ...爲什麼這樣? – 2013-03-03 12:42:37

+1

這些線程獨立運行。您無法猜測訂單。如果您希望一個在另一個之前運行(或者在創建線程之前加入一個線程),則需要某種形式的同步。 – Mat 2013-03-03 12:45:19

+0

是在創建thread2之前,如果我正在使用thread_join它會給我正確的結果......但在之前的情況下我可以使用哪些技術? – 2013-03-03 12:50:32