2016-11-26 89 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