2017-05-05 113 views
0

我遇到了奇怪的行为pthread_create函数。代码如下:创建线程很慢

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

void *foo(void* a) { 
    printf("Doing something"); 
    pthread_exit(NULL); 
} 

int main() { 
    printf("Main created"); 
    pthread_t thread; 
    pthread_create(&thread, NULL, foo, NULL); 

    while(1); // This causes trouble 

    pthread_join(thread, NULL); 

    return 0; 
} 

出于某种原因,在地方while,从跟帖留言很长的延迟后显示。我希望在pthread_create之后调用新线程是完全独立于main的,因此不应该被它的代码所影响。

+2

您是否尝试刷新'stdout'? –

+0

@BenSteffan谢谢你的评论,在这个例子中它是由输出缓冲引起的。 – Lorin

+0

对'printf()'的调用正在写入'stdout'流缓冲区。要通过该缓冲区并显示在终端上,必须发生以下三件事之一。 1)缓冲区溢出(不太可能)2)程序结束3)格式字符串或数据以'\ n'结尾(未完成)因此在程序结束之前不会输出任何内容。 'while(1);'循环永远不会退出,所以程序永远不会结束。还要注意:'main()'会吸收所有循环的CPU周期,所以没有任何东西可以让创建的线程运行。建议:使用'\ n'结束每个'printf()'格式字符串并移除'while()'语句 – user3629249

回答

3

这与线程无关。

你会发现有发生相同的行为:

printf("Doing something"); 
while(1) ; 

这是因为你没有包含在你打印的字符串,这将导致线路被缓冲的结尾换行。由于没有进一步的输出产生,该线可能会被缓冲很长时间(甚至可能永远)。

为了避免这种情况,您可以:

  • 添加新行所有的输出线,例如中printf("Doing something\n");

  • 呼叫fflush(stdout)printf()之后促使行被刷新

  • 呼叫setvbuf(stdout, NULL, _IONBF, 0)事先禁用所有的输出缓冲

+1

我会在while(1);'while'(1){usleep(10);}'时改变''。没有理由对待这样的CPU :) – RoiHatam

+0

@RoiHatam这不应该是一个实际的例子。 – duskwuff

+0

@duskwuff,你说得对,在这个特殊的例子中,它是由输出缓冲引起的。然而,在实际代码中,这个例子往往非常相似(主要产生一个线程并跳转到一个while循环),我在输出中使用了换行符。虽然我不知道为什么,但在while循环中添加一个简短的usleep实际上有所帮助。 – Lorin