2016-11-26 88 views
3

現在,這只是一個小測試,並且是學校作業的一部分。在我的代碼中,printf至少不會讓我看到它。這是線程無法運行的結果嗎?打印線在線程之外工作。感謝您的任何幫助。C printf不在線內打印?

我是新的線程在c。

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


void *threadServer(void *arg) 
{ 
     printf("This is the file Name: %s\n", arg); 
     pthread_exit(0); 


} 

int main(int argc, char* argv[]){ 
     int i=1; 
     while(argv[i]!=NULL){ 
       pthread_t thread; 
       pthread_create(&thread, NULL, threadServer,argv[i]); 
       i++; 
     } 
+3

您需要啓動線程,並等待它完成,否則在打印之前該程序可能會結束:因此,用於實驗的緣故,代碼可以做如下修改。 – Carcigenicate

+0

您在此粘貼的代碼是否完整?如果是這樣,它就會丟失'pthread_join'調用,以等待線程完成。否則,您的主程序可能在線程有機會運行之前退出。 –

+0

這是完整的好吧知道我錯過了一些東西。 – TheMangaStand

回答

3

在你的代碼,這創造了另一個線程執行的父線程執行完畢,而無需等待其子線程完成。線程與進程不同,一旦父線程終止,它的所有子線程也終止。

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

void *threadServer(void *arg) 
{ 
    printf("This is the file Name: %s\n", (char*)arg); 
    pthread_exit(0); 
} 

int main(int argc, char* argv[]){ 
    int i=1; 
    while(argv[i]!=NULL){ 
     pthread_t thread; 
     pthread_create(&thread, NULL, threadServer, argv[i]); 
     i++; 
     pthread_join(thread, NULL); 
    } 
} 

這樣做將允許創建的線程運行,直到它完成執行。 pthread_join將等待線程完成其執行,然後繼續。

編輯

隨着人們卻在評論中提到,它可能是毫無價值試圖生成一個單獨的線程,並立即加入它,使它不超過執行單線程更好。

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

void *threadServer(void *arg) 
{ 
    printf("This is the file Name: %s\n", (char*)arg); 
} 

int main(int argc, char* argv[]){ 
    int i = 1; 
    pthread_t thread[argc - 1]; 

    while(i < argc) 
    { 
     pthread_create(&thread[i-1], NULL, threadServer, argv[i]); 
     i++; 
    } 

    for (i = 0; i < argc - 1; ++i) 
    { 
     pthread_join(thread[i], NULL); 
    } 
} 
+0

當然,產生一個線程,然後立即加入它是一個有點奇怪的事情,除了學術活動。 – pat

+0

@pat奇怪的是,是的。但只是爲了適應OP的學術實驗。這是不可取的,因爲創建單個線程沒有意義,然後再加入它,再次產生另一個線程!因爲它不會比使用單個執行線程更好。考慮到創建這些線程所涉及的所有開銷,這仍然更糟糕。 –

+0

@Djack哦,所以它不會併發。然後在循環之後加入它?如果我想了解這個curleyley。 – TheMangaStand