我正在运行一个高度线程化的应用程序(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行)。
答案 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
需要在上面的示例中定义,并且还需要是指针。