确保所有Printf都在线程中实际打印

时间:2011-03-31 01:44:48

标签: c multithreading pthreads posix printf

我正在运行一个高度线程化的应用程序(500多个线程)。我需要跟踪它们中的一些数据,并且这样做是从线程打印的。看来输出只是切断了。我也确保经常刷新标准输出,我也尝试使用互斥锁来协调输出。这些解决方案都没有奏效。

这是有问题的话题:

void* troutine(void* tmp) {
    a = RDTSC();
    chance = Park(state);
    b = RDTSC();

    printf("%s.%i.%c : %lli\n", IMPLEMENTATION, *(int*)tmp, 'T', b-a);


    usleep(RAND(50));

    a = RDTSC();
    Leave(chance, state);
    b = RDTSC();
    printf("%s.%i.%c : %lli\n", IMPLEMENTATION, *(int*)tmp, 'T', b-a);

    fflush(stdout);
    pthread_exit(NULL);
}

实际打印只有大​​约一半的打印语句,这就是问题所在。我需要确保它们全部打印,顺序无关紧要,并且没有任何输出交织。

编辑 main.c

for(i = 0; i < 4000; i++) 
    while(!pthread_create(&tmp, NULL, &troutine, (void*)&testNum));

while循环是为了确保创建4k个线程,因为有时候pthread_create会因为这么多线程处于活动状态而失败。而且,即使我只设置循环使i&lt; 4个线程,我仍然得到~300行输出(而不是8行)。

2 个答案:

答案 0 :(得分:4)

(1)在线程完成之前,你将脱离main()。加入线程或在main()中放置一个pthread_exit(),这样它就不会在退出时杀死正在运行的线程。

for(i = 0; i < 4000; i++) 
    while(!pthread_create(&tmp, NULL, &troutine, (void*)&testNum));

(2)Pthread_create在成功时返回0。所以上面的while循环说“成功的时候,继续创建线程”。当我只有4时,这就解释了很多输出。

答案 1 :(得分:1)

编辑2:另一种可能性是你的问题超出了这段代码,并且有些东西正在调用exit(如果没有崩溃),那么你的一半线程永远不会完成。通过“切断”来了解更多关于你的意思真的很有帮助。


[如R所述,这不应该是必要的。只留下它以便评论线程有意义。]

当你说你正在使用锁时,你是否正在使用某种全局互斥锁:

pthread_mutex_lock(mutex);
printf("%s.%i.%c : %lli\n", IMPLEMENTATION, *(int*)tmp, 'T', b-a);
pthread_mutex_unlock(mutex);

因为我在你的例子中没有看到。请注意,mutex需要在上面的示例中定义,并且还需要是指针。